runner-controller: do not delete runner if it is busy (#103)

Currently, after refreshing the token, the controller re-creates the runner with the new token. This results in jobs being interrupted. This PR makes sure the pod is not restarted if it is busy.

Closes #74
This commit is contained in:
Helder Moreira 2020-10-05 01:06:37 +01:00 committed by GitHub
parent 7b5e62e266
commit 7a2fa7fbce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 539 additions and 102 deletions

View File

@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations: annotations:
controller-gen.kubebuilder.io/version: v0.2.4 controller-gen.kubebuilder.io/version: v0.3.0
creationTimestamp: null creationTimestamp: null
name: horizontalrunnerautoscalers.actions.summerwind.dev name: horizontalrunnerautoscalers.actions.summerwind.dev
spec: spec:

View File

@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations: annotations:
controller-gen.kubebuilder.io/version: v0.2.4 controller-gen.kubebuilder.io/version: v0.3.0
creationTimestamp: null creationTimestamp: null
name: runnerdeployments.actions.summerwind.dev name: runnerdeployments.actions.summerwind.dev
spec: spec:
@ -788,10 +788,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -1256,6 +1260,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. description: 'Periodic probe of container service readiness.
Container will be removed from service endpoints if Container will be removed from service endpoints if
@ -1381,13 +1389,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -1847,9 +1863,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -2033,10 +2053,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -2611,13 +2635,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -3127,10 +3159,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -3595,6 +3631,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. description: 'Periodic probe of container service readiness.
Container will be removed from service endpoints if Container will be removed from service endpoints if
@ -3720,13 +3760,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -4135,13 +4183,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute description: 'Limits describes the maximum amount of compute
resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute description: 'Requests describes the minimum amount of compute
resources required. If Requests is omitted for a container, resources required. If Requests is omitted for a container,
it defaults to Limits if that is explicitly specified, it defaults to Limits if that is explicitly specified,
@ -4385,10 +4441,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -4853,6 +4913,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. description: 'Periodic probe of container service readiness.
Container will be removed from service endpoints if Container will be removed from service endpoints if
@ -4978,13 +5042,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -5800,10 +5872,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -5826,6 +5902,9 @@ spec:
string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string type: string
sizeLimit: sizeLimit:
anyOf:
- type: integer
- type: string
description: 'Total amount of local storage required description: 'Total amount of local storage required
for this EmptyDir volume. The size limit is also for this EmptyDir volume. The size limit is also
applicable for memory medium. The maximum usage applicable for memory medium. The maximum usage
@ -5834,7 +5913,8 @@ spec:
of memory limits of all containers in a pod. The of memory limits of all containers in a pod. The
default is nil which means that the limit is undefined. default is nil which means that the limit is undefined.
More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
type: object type: object
fc: fc:
description: FC represents a Fibre Channel resource that description: FC represents a Fibre Channel resource that
@ -6321,10 +6401,14 @@ spec:
for env vars' for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output description: Specifies the output
format of the exposed resources, format of the exposed resources,
defaults to "1" defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource description: 'Required: resource
to select' to select'

View File

@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations: annotations:
controller-gen.kubebuilder.io/version: v0.2.4 controller-gen.kubebuilder.io/version: v0.3.0
creationTimestamp: null creationTimestamp: null
name: runnerreplicasets.actions.summerwind.dev name: runnerreplicasets.actions.summerwind.dev
spec: spec:
@ -788,10 +788,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -1256,6 +1260,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. description: 'Periodic probe of container service readiness.
Container will be removed from service endpoints if Container will be removed from service endpoints if
@ -1381,13 +1389,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -1847,9 +1863,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -2033,10 +2053,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -2611,13 +2635,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -3127,10 +3159,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -3595,6 +3631,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. description: 'Periodic probe of container service readiness.
Container will be removed from service endpoints if Container will be removed from service endpoints if
@ -3720,13 +3760,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -4135,13 +4183,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute description: 'Limits describes the maximum amount of compute
resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute description: 'Requests describes the minimum amount of compute
resources required. If Requests is omitted for a container, resources required. If Requests is omitted for a container,
it defaults to Limits if that is explicitly specified, it defaults to Limits if that is explicitly specified,
@ -4385,10 +4441,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -4853,6 +4913,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. description: 'Periodic probe of container service readiness.
Container will be removed from service endpoints if Container will be removed from service endpoints if
@ -4978,13 +5042,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount description: 'Limits describes the maximum amount
of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount description: 'Requests describes the minimum amount
of compute resources required. If Requests is omitted of compute resources required. If Requests is omitted
for a container, it defaults to Limits if that is for a container, it defaults to Limits if that is
@ -5800,10 +5872,14 @@ spec:
volumes, optional for env vars' volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -5826,6 +5902,9 @@ spec:
string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string type: string
sizeLimit: sizeLimit:
anyOf:
- type: integer
- type: string
description: 'Total amount of local storage required description: 'Total amount of local storage required
for this EmptyDir volume. The size limit is also for this EmptyDir volume. The size limit is also
applicable for memory medium. The maximum usage applicable for memory medium. The maximum usage
@ -5834,7 +5913,8 @@ spec:
of memory limits of all containers in a pod. The of memory limits of all containers in a pod. The
default is nil which means that the limit is undefined. default is nil which means that the limit is undefined.
More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
type: object type: object
fc: fc:
description: FC represents a Fibre Channel resource that description: FC represents a Fibre Channel resource that
@ -6321,10 +6401,14 @@ spec:
for env vars' for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output description: Specifies the output
format of the exposed resources, format of the exposed resources,
defaults to "1" defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource description: 'Required: resource
to select' to select'

View File

@ -4,7 +4,7 @@ apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations: annotations:
controller-gen.kubebuilder.io/version: v0.2.4 controller-gen.kubebuilder.io/version: v0.3.0
creationTimestamp: null creationTimestamp: null
name: runners.actions.summerwind.dev name: runners.actions.summerwind.dev
spec: spec:
@ -723,9 +723,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -1160,6 +1164,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. Container description: 'Periodic probe of container service readiness. Container
will be removed from service endpoints if the probe fails. Cannot will be removed from service endpoints if the probe fails. Cannot
@ -1282,13 +1290,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute description: 'Limits describes the maximum amount of compute
resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute description: 'Requests describes the minimum amount of compute
resources required. If Requests is omitted for a container, resources required. If Requests is omitted for a container,
it defaults to Limits if that is explicitly specified, otherwise it defaults to Limits if that is explicitly specified, otherwise
@ -1722,9 +1738,13 @@ spec:
for env vars' for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the exposed description: Specifies the output format of the exposed
resources, defaults to "1" resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -1894,9 +1914,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -2440,13 +2464,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute description: 'Limits describes the maximum amount of compute
resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute description: 'Requests describes the minimum amount of compute
resources required. If Requests is omitted for a container, resources required. If Requests is omitted for a container,
it defaults to Limits if that is explicitly specified, otherwise it defaults to Limits if that is explicitly specified, otherwise
@ -2930,9 +2962,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -3367,6 +3403,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. Container description: 'Periodic probe of container service readiness. Container
will be removed from service endpoints if the probe fails. Cannot will be removed from service endpoints if the probe fails. Cannot
@ -3489,13 +3529,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute description: 'Limits describes the maximum amount of compute
resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute description: 'Requests describes the minimum amount of compute
resources required. If Requests is omitted for a container, resources required. If Requests is omitted for a container,
it defaults to Limits if that is explicitly specified, otherwise it defaults to Limits if that is explicitly specified, otherwise
@ -3883,13 +3931,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute resources description: 'Limits describes the maximum amount of compute resources
allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute resources description: 'Requests describes the minimum amount of compute resources
required. If Requests is omitted for a container, it defaults required. If Requests is omitted for a container, it defaults
to Limits if that is explicitly specified, otherwise to an implementation-defined to Limits if that is explicitly specified, otherwise to an implementation-defined
@ -4118,9 +4174,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -4555,6 +4615,10 @@ spec:
- containerPort - containerPort
type: object type: object
type: array type: array
x-kubernetes-list-map-keys:
- containerPort
- protocol
x-kubernetes-list-type: map
readinessProbe: readinessProbe:
description: 'Periodic probe of container service readiness. Container description: 'Periodic probe of container service readiness. Container
will be removed from service endpoints if the probe fails. Cannot will be removed from service endpoints if the probe fails. Cannot
@ -4677,13 +4741,21 @@ spec:
properties: properties:
limits: limits:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Limits describes the maximum amount of compute description: 'Limits describes the maximum amount of compute
resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object type: object
requests: requests:
additionalProperties: additionalProperties:
type: string anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
description: 'Requests describes the minimum amount of compute description: 'Requests describes the minimum amount of compute
resources required. If Requests is omitted for a container, resources required. If Requests is omitted for a container,
it defaults to Limits if that is explicitly specified, otherwise it defaults to Limits if that is explicitly specified, otherwise
@ -5451,9 +5523,13 @@ spec:
optional for env vars' optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format of the description: Specifies the output format of the
exposed resources, defaults to "1" exposed resources, defaults to "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string
@ -5476,6 +5552,9 @@ spec:
More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string type: string
sizeLimit: sizeLimit:
anyOf:
- type: integer
- type: string
description: 'Total amount of local storage required for this description: 'Total amount of local storage required for this
EmptyDir volume. The size limit is also applicable for memory EmptyDir volume. The size limit is also applicable for memory
medium. The maximum usage on memory medium EmptyDir would medium. The maximum usage on memory medium EmptyDir would
@ -5483,7 +5562,8 @@ spec:
and the sum of memory limits of all containers in a pod. and the sum of memory limits of all containers in a pod.
The default is nil which means that the limit is undefined. The default is nil which means that the limit is undefined.
More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
type: object type: object
fc: fc:
description: FC represents a Fibre Channel resource that is attached description: FC represents a Fibre Channel resource that is attached
@ -5940,10 +6020,14 @@ spec:
for volumes, optional for env vars' for volumes, optional for env vars'
type: string type: string
divisor: divisor:
anyOf:
- type: integer
- type: string
description: Specifies the output format description: Specifies the output format
of the exposed resources, defaults to of the exposed resources, defaults to
"1" "1"
type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
resource: resource:
description: 'Required: resource to select' description: 'Required: resource to select'
type: string type: string

View File

@ -2,9 +2,10 @@ package controllers
import ( import (
"context" "context"
"github.com/summerwind/actions-runner-controller/github/fake"
"time" "time"
"github.com/summerwind/actions-runner-controller/github/fake"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
@ -44,7 +45,7 @@ func SetupIntegrationTest(ctx context.Context) *testEnvironment {
Status: 200, Status: 200,
Body: workflowRunsFor3Replicas, Body: workflowRunsFor3Replicas,
} }
server := fake.NewServer(fake.WithFixedResponses(responses)) fakeGithubServer := fake.NewServer(fake.WithFixedResponses(responses))
BeforeEach(func() { BeforeEach(func() {
stopCh = make(chan struct{}) stopCh = make(chan struct{})
@ -58,11 +59,16 @@ func SetupIntegrationTest(ctx context.Context) *testEnvironment {
mgr, err := ctrl.NewManager(cfg, ctrl.Options{}) mgr, err := ctrl.NewManager(cfg, ctrl.Options{})
Expect(err).NotTo(HaveOccurred(), "failed to create manager") Expect(err).NotTo(HaveOccurred(), "failed to create manager")
runnersList = fake.NewRunnersList()
server = runnersList.GetServer()
ghClient := newGithubClient(server)
replicasetController := &RunnerReplicaSetReconciler{ replicasetController := &RunnerReplicaSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Scheme: scheme.Scheme, Scheme: scheme.Scheme,
Log: logf.Log, Log: logf.Log,
Recorder: mgr.GetEventRecorderFor("runnerreplicaset-controller"), Recorder: mgr.GetEventRecorderFor("runnerreplicaset-controller"),
GitHubClient: ghClient,
} }
err = replicasetController.SetupWithManager(mgr) err = replicasetController.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@ -76,7 +82,7 @@ func SetupIntegrationTest(ctx context.Context) *testEnvironment {
err = deploymentsController.SetupWithManager(mgr) err = deploymentsController.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
client := newGithubClient(server) client := newGithubClient(fakeGithubServer)
autoscalerController := &HorizontalRunnerAutoscalerReconciler{ autoscalerController := &HorizontalRunnerAutoscalerReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
@ -99,7 +105,7 @@ func SetupIntegrationTest(ctx context.Context) *testEnvironment {
AfterEach(func() { AfterEach(func() {
close(stopCh) close(stopCh)
server.Close() fakeGithubServer.Close()
err := k8sClient.Delete(ctx, ns) err := k8sClient.Delete(ctx, ns)
Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace") Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace")

View File

@ -203,12 +203,16 @@ func (r *RunnerReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
return ctrl.Result{}, err return ctrl.Result{}, err
} }
if pod.Spec.Containers[0].Image != newPod.Spec.Containers[0].Image { runnerBusy, err := r.isRunnerBusy(ctx, runner.Spec.Organization, runner.Spec.Repository, runner.Name)
restart = true if err != nil {
} log.Error(err, "Failed to check if runner is busy")
if !reflect.DeepEqual(pod.Spec.Containers[0].Env, newPod.Spec.Containers[0].Env) { return ctrl.Result{}, nil
}
if !runnerBusy && (!reflect.DeepEqual(pod.Spec.Containers[0].Env, newPod.Spec.Containers[0].Env) || pod.Spec.Containers[0].Image != newPod.Spec.Containers[0].Image) {
restart = true restart = true
} }
if !restart { if !restart {
return ctrl.Result{}, err return ctrl.Result{}, err
} }
@ -225,6 +229,21 @@ func (r *RunnerReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
func (r *RunnerReconciler) isRunnerBusy(ctx context.Context, org, repo, name string) (bool, error) {
runners, err := r.GitHubClient.ListRunners(ctx, org, repo)
if err != nil {
return false, err
}
for _, runner := range runners {
if runner.GetName() == name {
return runner.GetBusy(), nil
}
}
return false, fmt.Errorf("runner not found")
}
func (r *RunnerReconciler) unregisterRunner(ctx context.Context, org, repo, name string) (bool, error) { func (r *RunnerReconciler) unregisterRunner(ctx context.Context, org, repo, name string) (bool, error) {
runners, err := r.GitHubClient.ListRunners(ctx, org, repo) runners, err := r.GitHubClient.ListRunners(ctx, org, repo)
if err != nil { if err != nil {
@ -234,6 +253,9 @@ func (r *RunnerReconciler) unregisterRunner(ctx context.Context, org, repo, name
id := int64(0) id := int64(0)
for _, runner := range runners { for _, runner := range runners {
if runner.GetName() == name { if runner.GetName() == name {
if runner.GetBusy() {
return false, fmt.Errorf("runner is busy")
}
id = runner.GetID() id = runner.GetID()
break break
} }

View File

@ -31,6 +31,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/summerwind/actions-runner-controller/api/v1alpha1" "github.com/summerwind/actions-runner-controller/api/v1alpha1"
"github.com/summerwind/actions-runner-controller/github"
) )
// RunnerReplicaSetReconciler reconciles a Runner object // RunnerReplicaSetReconciler reconciles a Runner object
@ -39,6 +40,7 @@ type RunnerReplicaSetReconciler struct {
Log logr.Logger Log logr.Logger
Recorder record.EventRecorder Recorder record.EventRecorder
Scheme *runtime.Scheme Scheme *runtime.Scheme
GitHubClient *github.Client
} }
// +kubebuilder:rbac:groups=actions.summerwind.dev,resources=runnerreplicasets,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=actions.summerwind.dev,resources=runnerreplicasets,verbs=get;list;watch;create;update;patch;delete
@ -96,8 +98,25 @@ func (r *RunnerReplicaSetReconciler) Reconcile(req ctrl.Request) (ctrl.Result, e
if available > desired { if available > desired {
n := available - desired n := available - desired
// get runners that are currently not busy
var notBusy []v1alpha1.Runner
for _, runner := range myRunners {
busy, err := r.isRunnerBusy(ctx, runner.Spec.Organization, runner.Spec.Repository, runner.Name)
if err != nil {
log.Error(err, "Failed to check if runner is busy")
return ctrl.Result{}, err
}
if !busy {
notBusy = append(notBusy, runner)
}
}
if len(notBusy) < n {
n = len(notBusy)
}
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
if err := r.Client.Delete(ctx, &myRunners[i]); err != nil { if err := r.Client.Delete(ctx, &notBusy[i]); err != nil {
log.Error(err, "Failed to delete runner resource") log.Error(err, "Failed to delete runner resource")
return ctrl.Result{}, err return ctrl.Result{}, err
@ -166,3 +185,19 @@ func (r *RunnerReplicaSetReconciler) SetupWithManager(mgr ctrl.Manager) error {
Owns(&v1alpha1.Runner{}). Owns(&v1alpha1.Runner{}).
Complete(r) Complete(r)
} }
func (r *RunnerReplicaSetReconciler) isRunnerBusy(ctx context.Context, org, repo, name string) (bool, error) {
runners, err := r.GitHubClient.ListRunners(ctx, org, repo)
r.Log.Info("runners", "github", runners)
if err != nil {
return false, err
}
for _, runner := range runners {
if runner.GetName() == name {
return runner.GetBusy(), nil
}
}
return false, fmt.Errorf("runner not found")
}

View File

@ -3,11 +3,14 @@ package controllers
import ( import (
"context" "context"
"math/rand" "math/rand"
"net/http/httptest"
"time" "time"
"github.com/google/go-github/v32/github"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
"k8s.io/utils/pointer"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log" logf "sigs.k8s.io/controller-runtime/pkg/log"
@ -17,6 +20,12 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
actionsv1alpha1 "github.com/summerwind/actions-runner-controller/api/v1alpha1" actionsv1alpha1 "github.com/summerwind/actions-runner-controller/api/v1alpha1"
"github.com/summerwind/actions-runner-controller/github/fake"
)
var (
runnersList *fake.RunnersList
server *httptest.Server
) )
// SetupTest will set up a testing environment. // SetupTest will set up a testing environment.
@ -41,11 +50,16 @@ func SetupTest(ctx context.Context) *corev1.Namespace {
mgr, err := ctrl.NewManager(cfg, ctrl.Options{}) mgr, err := ctrl.NewManager(cfg, ctrl.Options{})
Expect(err).NotTo(HaveOccurred(), "failed to create manager") Expect(err).NotTo(HaveOccurred(), "failed to create manager")
runnersList = fake.NewRunnersList()
server = runnersList.GetServer()
ghClient := newGithubClient(server)
controller := &RunnerReplicaSetReconciler{ controller := &RunnerReplicaSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Scheme: scheme.Scheme, Scheme: scheme.Scheme,
Log: logf.Log, Log: logf.Log,
Recorder: mgr.GetEventRecorderFor("runnerreplicaset-controller"), Recorder: mgr.GetEventRecorderFor("runnerreplicaset-controller"),
GitHubClient: ghClient,
} }
err = controller.SetupWithManager(mgr) err = controller.SetupWithManager(mgr)
Expect(err).NotTo(HaveOccurred(), "failed to setup controller") Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@ -61,6 +75,7 @@ func SetupTest(ctx context.Context) *corev1.Namespace {
AfterEach(func() { AfterEach(func() {
close(stopCh) close(stopCh)
server.Close()
err := k8sClient.Delete(ctx, ns) err := k8sClient.Delete(ctx, ns)
Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace") Expect(err).NotTo(HaveOccurred(), "failed to delete test namespace")
}) })
@ -124,6 +139,16 @@ var _ = Context("Inside of a new namespace", func() {
logf.Log.Error(err, "list runners") logf.Log.Error(err, "list runners")
} }
for i, runner := range runners.Items {
runnersList.Add(&github.Runner{
ID: pointer.Int64Ptr(int64(i) + 1),
Name: pointer.StringPtr(runner.Name),
OS: pointer.StringPtr("linux"),
Status: pointer.StringPtr("online"),
Busy: pointer.BoolPtr(false),
})
}
return len(runners.Items) return len(runners.Items)
}, },
time.Second*5, time.Millisecond*500).Should(BeEquivalentTo(1)) time.Second*5, time.Millisecond*500).Should(BeEquivalentTo(1))
@ -155,6 +180,16 @@ var _ = Context("Inside of a new namespace", func() {
logf.Log.Error(err, "list runners") logf.Log.Error(err, "list runners")
} }
for i, runner := range runners.Items {
runnersList.Add(&github.Runner{
ID: pointer.Int64Ptr(int64(i) + 1),
Name: pointer.StringPtr(runner.Name),
OS: pointer.StringPtr("linux"),
Status: pointer.StringPtr("online"),
Busy: pointer.BoolPtr(false),
})
}
return len(runners.Items) return len(runners.Items)
}, },
time.Second*5, time.Millisecond*500).Should(BeEquivalentTo(2)) time.Second*5, time.Millisecond*500).Should(BeEquivalentTo(2))
@ -186,6 +221,16 @@ var _ = Context("Inside of a new namespace", func() {
logf.Log.Error(err, "list runners") logf.Log.Error(err, "list runners")
} }
for i, runner := range runners.Items {
runnersList.Add(&github.Runner{
ID: pointer.Int64Ptr(int64(i) + 1),
Name: pointer.StringPtr(runner.Name),
OS: pointer.StringPtr("linux"),
Status: pointer.StringPtr("online"),
Busy: pointer.BoolPtr(false),
})
}
return len(runners.Items) return len(runners.Items)
}, },
time.Second*5, time.Millisecond*500).Should(BeEquivalentTo(0)) time.Second*5, time.Millisecond*500).Should(BeEquivalentTo(0))

View File

@ -14,8 +14,8 @@ const (
{ {
"total_count": 2, "total_count": 2,
"runners": [ "runners": [
{"id": 1, "name": "test1", "os": "linux", "status": "online"}, {"id": 1, "name": "test1", "os": "linux", "status": "online", "busy": false},
{"id": 2, "name": "test2", "os": "linux", "status": "offline"} {"id": 2, "name": "test2", "os": "linux", "status": "offline", "busy": false}
] ]
} }
` `

74
github/fake/runners.go Normal file
View File

@ -0,0 +1,74 @@
package fake
import (
"encoding/json"
"net/http"
"net/http/httptest"
"strconv"
"github.com/google/go-github/v32/github"
"github.com/gorilla/mux"
)
type RunnersList struct {
runners []*github.Runner
}
func NewRunnersList() *RunnersList {
return &RunnersList{
runners: make([]*github.Runner, 0),
}
}
func (r *RunnersList) Add(runner *github.Runner) {
if !exists(r.runners, runner) {
r.runners = append(r.runners, runner)
}
}
func (r *RunnersList) GetServer() *httptest.Server {
router := mux.NewRouter()
router.Handle("/repos/{owner}/{repo}/actions/runners", r.handleList())
router.Handle("/repos/{owner}/{repo}/actions/runners/{id}", r.handleRemove())
router.Handle("/orgs/{org}/actions/runners", r.handleList())
router.Handle("/orgs/{org}/actions/runners/{id}", r.handleRemove())
return httptest.NewServer(router)
}
func (r *RunnersList) handleList() http.HandlerFunc {
return func(w http.ResponseWriter, res *http.Request) {
j, err := json.Marshal(github.Runners{
TotalCount: len(r.runners),
Runners: r.runners,
})
if err != nil {
panic(err)
}
w.WriteHeader(http.StatusOK)
w.Write(j)
}
}
func (r *RunnersList) handleRemove() http.HandlerFunc {
return func(w http.ResponseWriter, res *http.Request) {
vars := mux.Vars(res)
for i, runner := range r.runners {
if runner.ID != nil && vars["id"] == strconv.FormatInt(*runner.ID, 10) {
r.runners = append(r.runners[:i], r.runners[i+1:]...)
}
}
w.WriteHeader(http.StatusOK)
}
}
func exists(runners []*github.Runner, runner *github.Runner) bool {
for _, r := range runners {
if *r.Name == *runner.Name {
return true
}
}
return false
}

View File

@ -9,7 +9,7 @@ import (
"time" "time"
"github.com/bradleyfalzon/ghinstallation" "github.com/bradleyfalzon/ghinstallation"
"github.com/google/go-github/v31/github" "github.com/google/go-github/v32/github"
"golang.org/x/oauth2" "golang.org/x/oauth2"
) )
@ -85,7 +85,7 @@ func (c *Client) GetRegistrationToken(ctx context.Context, org, repo, name strin
return rt, nil return rt, nil
} }
// RemoveRunner removes a runner with specified runner ID from repocitory. // RemoveRunner removes a runner with specified runner ID from repository.
func (c *Client) RemoveRunner(ctx context.Context, org, repo string, runnerID int64) error { func (c *Client) RemoveRunner(ctx context.Context, org, repo string, runnerID int64) error {
owner, repo, err := getOwnerAndRepo(org, repo) owner, repo, err := getOwnerAndRepo(org, repo)
@ -121,7 +121,7 @@ func (c *Client) ListRunners(ctx context.Context, org, repo string) ([]*github.R
list, res, err := c.listRunners(ctx, owner, repo, &opts) list, res, err := c.listRunners(ctx, owner, repo, &opts)
if err != nil { if err != nil {
return runners, fmt.Errorf("failed to remove runner: %v", err) return runners, fmt.Errorf("failed to list runners: %v", err)
} }
runners = append(runners, list.Runners...) runners = append(runners, list.Runners...)

View File

@ -10,7 +10,7 @@ import (
"net/url" "net/url"
"reflect" "reflect"
"github.com/google/go-github/v31/github" "github.com/google/go-github/v32/github"
"github.com/google/go-querystring/query" "github.com/google/go-querystring/query"
) )

View File

@ -7,7 +7,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/google/go-github/v31/github" "github.com/google/go-github/v32/github"
"github.com/summerwind/actions-runner-controller/github/fake" "github.com/summerwind/actions-runner-controller/github/fake"
) )
@ -41,9 +41,9 @@ func TestGetRegistrationToken(t *testing.T) {
token string token string
err bool err bool
}{ }{
{org: "test", repo: "valid", token: fake.RegistrationToken, err: false}, {org: "", repo: "test/valid", token: fake.RegistrationToken, err: false},
{org: "test", repo: "invalid", token: "", err: true}, {org: "", repo: "test/invalid", token: "", err: true},
{org: "test", repo: "error", token: "", err: true}, {org: "", repo: "test/error", token: "", err: true},
{org: "test", repo: "", token: fake.RegistrationToken, err: false}, {org: "test", repo: "", token: fake.RegistrationToken, err: false},
{org: "invalid", repo: "", token: "", err: true}, {org: "invalid", repo: "", token: "", err: true},
{org: "error", repo: "", token: "", err: true}, {org: "error", repo: "", token: "", err: true},
@ -68,9 +68,9 @@ func TestListRunners(t *testing.T) {
length int length int
err bool err bool
}{ }{
{org: "test", repo: "valid", length: 2, err: false}, {org: "", repo: "test/valid", length: 2, err: false},
{org: "test", repo: "invalid", length: 0, err: true}, {org: "", repo: "test/invalid", length: 0, err: true},
{org: "test", repo: "error", length: 0, err: true}, {org: "", repo: "test/error", length: 0, err: true},
{org: "test", repo: "", length: 2, err: false}, {org: "test", repo: "", length: 2, err: false},
{org: "invalid", repo: "", length: 0, err: true}, {org: "invalid", repo: "", length: 0, err: true},
{org: "error", repo: "", length: 0, err: true}, {org: "error", repo: "", length: 0, err: true},
@ -94,9 +94,9 @@ func TestRemoveRunner(t *testing.T) {
repo string repo string
err bool err bool
}{ }{
{org: "test", repo: "valid", err: false}, {org: "", repo: "test/valid", err: false},
{org: "test", repo: "invalid", err: true}, {org: "", repo: "test/invalid", err: true},
{org: "test", repo: "error", err: true}, {org: "", repo: "test/error", err: true},
{org: "test", repo: "", err: false}, {org: "test", repo: "", err: false},
{org: "invalid", repo: "", err: true}, {org: "invalid", repo: "", err: true},
{org: "error", repo: "", err: true}, {org: "error", repo: "", err: true},

5
go.mod
View File

@ -6,8 +6,9 @@ require (
github.com/bradleyfalzon/ghinstallation v1.1.1 github.com/bradleyfalzon/ghinstallation v1.1.1
github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew v1.1.1
github.com/go-logr/logr v0.1.0 github.com/go-logr/logr v0.1.0
github.com/google/go-github/v31 v31.0.0 github.com/google/go-github/v32 v32.1.1-0.20200822031813-d57a3a84ba04
github.com/google/go-querystring v1.0.0 github.com/google/go-querystring v1.0.0
github.com/gorilla/mux v1.8.0
github.com/onsi/ginkgo v1.8.0 github.com/onsi/ginkgo v1.8.0
github.com/onsi/gomega v1.5.0 github.com/onsi/gomega v1.5.0
github.com/stretchr/testify v1.4.0 // indirect github.com/stretchr/testify v1.4.0 // indirect
@ -15,6 +16,6 @@ require (
k8s.io/api v0.0.0-20190918155943-95b840bb6a1f k8s.io/api v0.0.0-20190918155943-95b840bb6a1f
k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655 k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655
k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90 k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90
k8s.io/klog v0.4.0 k8s.io/utils v0.0.0-20190801114015-581e00157fb1
sigs.k8s.io/controller-runtime v0.4.0 sigs.k8s.io/controller-runtime v0.4.0
) )

7
go.sum
View File

@ -116,11 +116,10 @@ github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU8N8Pts= github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU8N8Pts=
github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E=
github.com/google/go-github/v31 v31.0.0 h1:JJUxlP9lFK+ziXKimTCprajMApV1ecWD4NB6CCb0plo= github.com/google/go-github/v32 v32.1.1-0.20200822031813-d57a3a84ba04 h1:wEYk2h/GwOhImcVjiTIceP88WxVbXw2F+ARYUQMEsfg=
github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= github.com/google/go-github/v32 v32.1.1-0.20200822031813-d57a3a84ba04/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
@ -136,6 +135,8 @@ github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsC
github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk=
github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=

View File

@ -161,6 +161,7 @@ func main() {
Client: mgr.GetClient(), Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("RunnerReplicaSet"), Log: ctrl.Log.WithName("controllers").WithName("RunnerReplicaSet"),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
GitHubClient: ghClient,
} }
if err = runnerSetReconciler.SetupWithManager(mgr); err != nil { if err = runnerSetReconciler.SetupWithManager(mgr); err != nil {