|
|
|
|
@@ -192,351 +192,6 @@ var _ = Context("INTEGRATION: Inside of a new namespace", func() {
|
|
|
|
|
|
|
|
|
|
Describe("when no existing resources exist", func() {
|
|
|
|
|
|
|
|
|
|
It("should create and scale organizational runners without any scaling metrics on pull_request event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Organization: "test",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 2 replicas
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(2),
|
|
|
|
|
MaxReplicas: intPtr(5),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
Metrics: nil,
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
PullRequest: &actionsv1alpha1.PullRequestSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Branches: []string{"main"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(2, "count of fake runners after HRA creation")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas on second pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3, "runners after second webhook event")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale organization's repository runners on pull_request event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ExpectRunnerDeploymentEventuallyUpdates(ctx, ns.Name, name, func(rd *actionsv1alpha1.RunnerDeployment) {
|
|
|
|
|
rd.Spec.Replicas = intPtr(2)
|
|
|
|
|
})
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(3),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
Metrics: []actionsv1alpha1.MetricSpec{
|
|
|
|
|
{
|
|
|
|
|
Type: actionsv1alpha1.AutoscalingMetricTypeTotalNumberOfQueuedAndInProgressWorkflowRuns,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
PullRequest: &actionsv1alpha1.PullRequestSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Branches: []string{"main"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(3, "count of fake runners after HRA creation")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-down to 1 replica
|
|
|
|
|
{
|
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
|
|
|
|
|
|
env.Responses.ListRepositoryWorkflowRuns.Body = workflowRunsFor1Replicas
|
|
|
|
|
env.Responses.ListRepositoryWorkflowRuns.Statuses["queued"] = workflowRunsFor1Replicas_queued
|
|
|
|
|
env.Responses.ListRepositoryWorkflowRuns.Statuses["in_progress"] = workflowRunsFor1Replicas_in_progress
|
|
|
|
|
|
|
|
|
|
var hra actionsv1alpha1.HorizontalRunnerAutoscaler
|
|
|
|
|
|
|
|
|
|
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: ns.Name, Name: name}, &hra)
|
|
|
|
|
|
|
|
|
|
Expect(err).NotTo(HaveOccurred(), "failed to get test HorizontalRunnerAutoscaler resource")
|
|
|
|
|
|
|
|
|
|
hra.Annotations = map[string]string{
|
|
|
|
|
"force-update": "1",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = k8sClient.Update(ctx, &hra)
|
|
|
|
|
|
|
|
|
|
Expect(err).NotTo(HaveOccurred(), "failed to get test HorizontalRunnerAutoscaler resource")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1, "runners after HRA force update for scale-down")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 2 replicas on first pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2, "runners after first webhook event")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas on second pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3, "runners after second webhook event")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale organization's repository runners on check_run event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas by the default TotalNumberOfQueuedAndInProgressWorkflowRuns-based scaling
|
|
|
|
|
// See workflowRunsFor3Replicas_queued and workflowRunsFor3Replicas_in_progress for GitHub List-Runners API responses
|
|
|
|
|
// used while testing.
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(5),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
Metrics: []actionsv1alpha1.MetricSpec{
|
|
|
|
|
{
|
|
|
|
|
Type: actionsv1alpha1.AutoscalingMetricTypeTotalNumberOfQueuedAndInProgressWorkflowRuns,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
CheckRun: &actionsv1alpha1.CheckRunSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Status: "pending",
|
|
|
|
|
Repositories: []string{"valid", "foo", "bar"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3)
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(3, "count of fake list runners")
|
|
|
|
|
env.SyncRunnerRegistrations()
|
|
|
|
|
ExpectRunnerCountEventuallyEquals(ctx, ns.Name, 3)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 4 replicas on first check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 4, "runners after first webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(4, "count of fake list runners")
|
|
|
|
|
env.SyncRunnerRegistrations()
|
|
|
|
|
ExpectRunnerCountEventuallyEquals(ctx, ns.Name, 4)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 5 replicas on second check_run create webhook event
|
|
|
|
|
replicasAfterSecondWebhook := 5
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, replicasAfterSecondWebhook, "runners after second webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(replicasAfterSecondWebhook, "count of fake list runners")
|
|
|
|
|
env.SyncRunnerRegistrations()
|
|
|
|
|
ExpectRunnerCountEventuallyEquals(ctx, ns.Name, replicasAfterSecondWebhook)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Do not scale-up on third check_run create webhook event
|
|
|
|
|
// example repo is not in specified in actionsv1alpha1.CheckRunSpec.Repositories
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgCheckRunEvent("test", "example", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, replicasAfterSecondWebhook, "runners after third webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(replicasAfterSecondWebhook, "count of fake list runners")
|
|
|
|
|
env.SyncRunnerRegistrations()
|
|
|
|
|
ExpectRunnerCountEventuallyEquals(ctx, ns.Name, replicasAfterSecondWebhook)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale organization's repository runners on workflow_job event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
@@ -637,543 +292,6 @@ var _ = Context("INTEGRATION: Inside of a new namespace", func() {
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale organization's repository runners only on check_run event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 1 replica via ScaleUpTriggers.GitHubEvent.CheckRun based scaling
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(5),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
CheckRun: &actionsv1alpha1.CheckRunSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Status: "pending",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 2 replicas on first check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2, "runners after first webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(2, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas on second check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendOrgCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3, "runners after second webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(3, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale user's repository runners on pull_request event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ExpectRunnerDeploymentEventuallyUpdates(ctx, ns.Name, name, func(rd *actionsv1alpha1.RunnerDeployment) {
|
|
|
|
|
rd.Spec.Replicas = intPtr(2)
|
|
|
|
|
})
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(3),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
Metrics: []actionsv1alpha1.MetricSpec{
|
|
|
|
|
{
|
|
|
|
|
Type: actionsv1alpha1.AutoscalingMetricTypeTotalNumberOfQueuedAndInProgressWorkflowRuns,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
PullRequest: &actionsv1alpha1.PullRequestSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Branches: []string{"main"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(3, "count of fake runners after HRA creation")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-down to 1 replica
|
|
|
|
|
{
|
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
|
|
|
|
|
|
env.Responses.ListRepositoryWorkflowRuns.Body = workflowRunsFor1Replicas
|
|
|
|
|
env.Responses.ListRepositoryWorkflowRuns.Statuses["queued"] = workflowRunsFor1Replicas_queued
|
|
|
|
|
env.Responses.ListRepositoryWorkflowRuns.Statuses["in_progress"] = workflowRunsFor1Replicas_in_progress
|
|
|
|
|
|
|
|
|
|
var hra actionsv1alpha1.HorizontalRunnerAutoscaler
|
|
|
|
|
|
|
|
|
|
err := k8sClient.Get(ctx, types.NamespacedName{Namespace: ns.Name, Name: name}, &hra)
|
|
|
|
|
|
|
|
|
|
Expect(err).NotTo(HaveOccurred(), "failed to get test HorizontalRunnerAutoscaler resource")
|
|
|
|
|
|
|
|
|
|
hra.Annotations = map[string]string{
|
|
|
|
|
"force-update": "1",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = k8sClient.Update(ctx, &hra)
|
|
|
|
|
|
|
|
|
|
Expect(err).NotTo(HaveOccurred(), "failed to get test HorizontalRunnerAutoscaler resource")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1, "runners after HRA force update for scale-down")
|
|
|
|
|
ExpectHRADesiredReplicasEquals(ctx, ns.Name, name, 1, "runner deployment desired replicas")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 2 replicas on first pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2, "runners after first webhook event")
|
|
|
|
|
ExpectHRADesiredReplicasEquals(ctx, ns.Name, name, 2, "runner deployment desired replicas")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas on second pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3, "runners after second webhook event")
|
|
|
|
|
ExpectHRADesiredReplicasEquals(ctx, ns.Name, name, 3, "runner deployment desired replicas")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale user's repository runners only on pull_request event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(3),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
PullRequest: &actionsv1alpha1.PullRequestSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Branches: []string{"main"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake runners after HRA creation")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 2 replicas on first pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2, "runners after first webhook event")
|
|
|
|
|
ExpectHRADesiredReplicasEquals(ctx, ns.Name, name, 2, "runner deployment desired replicas")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas on second pull_request create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserPullRequestEvent("test", "valid", "main", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3, "runners after second webhook event")
|
|
|
|
|
ExpectHRADesiredReplicasEquals(ctx, ns.Name, name, 3, "runner deployment desired replicas")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale user's repository runners on check_run event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas by the default TotalNumberOfQueuedAndInProgressWorkflowRuns-based scaling
|
|
|
|
|
// See workflowRunsFor3Replicas_queued and workflowRunsFor3Replicas_in_progress for GitHub List-Runners API responses
|
|
|
|
|
// used while testing.
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(5),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
Metrics: []actionsv1alpha1.MetricSpec{
|
|
|
|
|
{
|
|
|
|
|
Type: actionsv1alpha1.AutoscalingMetricTypeTotalNumberOfQueuedAndInProgressWorkflowRuns,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
CheckRun: &actionsv1alpha1.CheckRunSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Status: "pending",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3)
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(3, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 4 replicas on first check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 4, "runners after first webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(4, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 5 replicas on second check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 5, "runners after second webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(5, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should create and scale user's repository runners only on check_run event", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
rd := &actionsv1alpha1.RunnerDeployment{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerDeploymentSpec{
|
|
|
|
|
Replicas: intPtr(1),
|
|
|
|
|
Selector: &metav1.LabelSelector{
|
|
|
|
|
MatchLabels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Template: actionsv1alpha1.RunnerTemplate{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Labels: map[string]string{
|
|
|
|
|
"foo": "bar",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.RunnerSpec{
|
|
|
|
|
RunnerConfig: actionsv1alpha1.RunnerConfig{
|
|
|
|
|
Repository: "test/valid",
|
|
|
|
|
Image: "bar",
|
|
|
|
|
Group: "baz",
|
|
|
|
|
},
|
|
|
|
|
RunnerPodSpec: actionsv1alpha1.RunnerPodSpec{
|
|
|
|
|
Env: []corev1.EnvVar{
|
|
|
|
|
{Name: "FOO", Value: "FOOVALUE"},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, rd, "test RunnerDeployment")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas by the default TotalNumberOfQueuedAndInProgressWorkflowRuns-based scaling
|
|
|
|
|
// See workflowRunsFor3Replicas_queued and workflowRunsFor3Replicas_in_progress for GitHub List-Runners API responses
|
|
|
|
|
// used while testing.
|
|
|
|
|
{
|
|
|
|
|
hra := &actionsv1alpha1.HorizontalRunnerAutoscaler{
|
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
|
Name: name,
|
|
|
|
|
Namespace: ns.Name,
|
|
|
|
|
},
|
|
|
|
|
Spec: actionsv1alpha1.HorizontalRunnerAutoscalerSpec{
|
|
|
|
|
ScaleTargetRef: actionsv1alpha1.ScaleTargetRef{
|
|
|
|
|
Name: name,
|
|
|
|
|
},
|
|
|
|
|
MinReplicas: intPtr(1),
|
|
|
|
|
MaxReplicas: intPtr(5),
|
|
|
|
|
ScaleDownDelaySecondsAfterScaleUp: intPtr(1),
|
|
|
|
|
ScaleUpTriggers: []actionsv1alpha1.ScaleUpTrigger{
|
|
|
|
|
{
|
|
|
|
|
GitHubEvent: &actionsv1alpha1.GitHubEventScaleUpTriggerSpec{
|
|
|
|
|
CheckRun: &actionsv1alpha1.CheckRunSpec{
|
|
|
|
|
Types: []string{"created"},
|
|
|
|
|
Status: "pending",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Amount: 1,
|
|
|
|
|
Duration: metav1.Duration{Duration: time.Minute},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ExpectCreate(ctx, hra, "test HorizontalRunnerAutoscaler")
|
|
|
|
|
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(1, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 2 replicas on first check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsCountEventuallyEquals(ctx, ns.Name, 1, "runner sets after webhook")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 2, "runners after first webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(2, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scale-up to 3 replicas on second check_run create webhook event
|
|
|
|
|
{
|
|
|
|
|
env.SendUserCheckRunEvent("test", "valid", "pending", "created")
|
|
|
|
|
ExpectRunnerSetsManagedReplicasCountEventuallyEquals(ctx, ns.Name, 3, "runners after second webhook event")
|
|
|
|
|
env.ExpectRegisteredNumberCountEventuallyEquals(3, "count of fake list runners")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
It("should be able to scale visible organization runner group with default labels", func() {
|
|
|
|
|
name := "example-runnerdeploy"
|
|
|
|
|
|
|
|
|
|
@@ -1370,51 +488,6 @@ func (env *testEnvironment) ExpectRegisteredNumberCountEventuallyEquals(want int
|
|
|
|
|
time.Second*10, time.Millisecond*500).Should(Equal(want), optionalDescriptions...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (env *testEnvironment) SendOrgPullRequestEvent(org, repo, branch, action string) {
|
|
|
|
|
resp, err := sendWebhook(env.webhookServer, "pull_request", &github.PullRequestEvent{
|
|
|
|
|
PullRequest: &github.PullRequest{
|
|
|
|
|
Base: &github.PullRequestBranch{
|
|
|
|
|
Ref: github.String(branch),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Repo: &github.Repository{
|
|
|
|
|
Name: github.String(repo),
|
|
|
|
|
Owner: &github.User{
|
|
|
|
|
Login: github.String(org),
|
|
|
|
|
Type: github.String("Organization"),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Action: github.String(action),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, err).NotTo(HaveOccurred(), "failed to send pull_request event")
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, resp.StatusCode).To(Equal(200))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (env *testEnvironment) SendOrgCheckRunEvent(org, repo, status, action string) {
|
|
|
|
|
resp, err := sendWebhook(env.webhookServer, "check_run", &github.CheckRunEvent{
|
|
|
|
|
CheckRun: &github.CheckRun{
|
|
|
|
|
Status: github.String(status),
|
|
|
|
|
},
|
|
|
|
|
Org: &github.Organization{
|
|
|
|
|
Login: github.String(org),
|
|
|
|
|
},
|
|
|
|
|
Repo: &github.Repository{
|
|
|
|
|
Name: github.String(repo),
|
|
|
|
|
Owner: &github.User{
|
|
|
|
|
Login: github.String(org),
|
|
|
|
|
Type: github.String("Organization"),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Action: github.String(action),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, err).NotTo(HaveOccurred(), "failed to send check_run event")
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, resp.StatusCode).To(Equal(200))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (env *testEnvironment) SendWorkflowJobEvent(org, repo, statusAndAction string, labels []string, runID int64, ID int64) {
|
|
|
|
|
resp, err := sendWebhook(env.webhookServer, "workflow_job", &github.WorkflowJobEvent{
|
|
|
|
|
WorkflowJob: &github.WorkflowJob{
|
|
|
|
|
@@ -1441,48 +514,6 @@ func (env *testEnvironment) SendWorkflowJobEvent(org, repo, statusAndAction stri
|
|
|
|
|
ExpectWithOffset(1, resp.StatusCode).To(Equal(200))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (env *testEnvironment) SendUserPullRequestEvent(owner, repo, branch, action string) {
|
|
|
|
|
resp, err := sendWebhook(env.webhookServer, "pull_request", &github.PullRequestEvent{
|
|
|
|
|
PullRequest: &github.PullRequest{
|
|
|
|
|
Base: &github.PullRequestBranch{
|
|
|
|
|
Ref: github.String(branch),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Repo: &github.Repository{
|
|
|
|
|
Name: github.String(repo),
|
|
|
|
|
Owner: &github.User{
|
|
|
|
|
Login: github.String(owner),
|
|
|
|
|
Type: github.String("User"),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Action: github.String(action),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, err).NotTo(HaveOccurred(), "failed to send pull_request event")
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, resp.StatusCode).To(Equal(200))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (env *testEnvironment) SendUserCheckRunEvent(owner, repo, status, action string) {
|
|
|
|
|
resp, err := sendWebhook(env.webhookServer, "check_run", &github.CheckRunEvent{
|
|
|
|
|
CheckRun: &github.CheckRun{
|
|
|
|
|
Status: github.String(status),
|
|
|
|
|
},
|
|
|
|
|
Repo: &github.Repository{
|
|
|
|
|
Name: github.String(repo),
|
|
|
|
|
Owner: &github.User{
|
|
|
|
|
Login: github.String(owner),
|
|
|
|
|
Type: github.String("User"),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Action: github.String(action),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, err).NotTo(HaveOccurred(), "failed to send check_run event")
|
|
|
|
|
|
|
|
|
|
ExpectWithOffset(1, resp.StatusCode).To(Equal(200))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (env *testEnvironment) SyncRunnerRegistrations() {
|
|
|
|
|
var runnerList actionsv1alpha1.RunnerList
|
|
|
|
|
|
|
|
|
|
|