Re-create the listener when GitHub secret is updated
This commit is contained in:
		
							parent
							
								
									15990d492d
								
							
						
					
					
						commit
						8a8d279aba
					
				|  | @ -279,10 +279,10 @@ type AutoscalingRunnerSetStatus struct { | ||||||
| 	FailedEphemeralRunners int `json:"failedEphemeralRunners"` | 	FailedEphemeralRunners int `json:"failedEphemeralRunners"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ars *AutoscalingRunnerSet) ListenerSpecHash() string { | func (ars *AutoscalingRunnerSet) ListenerSpecHash(githubSecret *corev1.Secret) string { | ||||||
| 	arsSpec := ars.Spec.DeepCopy() | 	arsSpec := ars.Spec.DeepCopy() | ||||||
| 	spec := arsSpec | 	secret := githubSecret.DeepCopy() | ||||||
| 	return hash.ComputeTemplateHash(&spec) | 	return hash.ComputeCombinedObjectsHash(&arsSpec, &secret) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (ars *AutoscalingRunnerSet) RunnerSetSpecHash() string { | func (ars *AutoscalingRunnerSet) RunnerSetSpecHash() string { | ||||||
|  |  | ||||||
|  | @ -246,7 +246,7 @@ func (r *AutoscalingRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl | ||||||
| 
 | 
 | ||||||
| 	// Our listener pod is out of date, so we need to delete it to get a new recreate.
 | 	// Our listener pod is out of date, so we need to delete it to get a new recreate.
 | ||||||
| 	listenerValuesHashChanged := listener.Annotations[annotationKeyValuesHash] != autoscalingRunnerSet.Annotations[annotationKeyValuesHash] | 	listenerValuesHashChanged := listener.Annotations[annotationKeyValuesHash] != autoscalingRunnerSet.Annotations[annotationKeyValuesHash] | ||||||
| 	listenerSpecHashChanged := listener.Annotations[annotationKeyRunnerSpecHash] != autoscalingRunnerSet.ListenerSpecHash() | 	listenerSpecHashChanged := listener.Annotations[annotationKeyRunnerSpecHash] != autoscalingRunnerSet.ListenerSpecHash(secret) | ||||||
| 	if listenerFound && (listenerValuesHashChanged || listenerSpecHashChanged) { | 	if listenerFound && (listenerValuesHashChanged || listenerSpecHashChanged) { | ||||||
| 		log.Info("RunnerScaleSetListener is out of date. Deleting it so that it is recreated", "name", listener.Name) | 		log.Info("RunnerScaleSetListener is out of date. Deleting it so that it is recreated", "name", listener.Name) | ||||||
| 		if err := r.Delete(ctx, listener); err != nil { | 		if err := r.Delete(ctx, listener); err != nil { | ||||||
|  | @ -297,7 +297,7 @@ func (r *AutoscalingRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl | ||||||
| 			return ctrl.Result{}, nil | 			return ctrl.Result{}, nil | ||||||
| 		} | 		} | ||||||
| 		log.Info("Creating a new AutoscalingListener for the runner set", "ephemeralRunnerSetName", latestRunnerSet.Name) | 		log.Info("Creating a new AutoscalingListener for the runner set", "ephemeralRunnerSetName", latestRunnerSet.Name) | ||||||
| 		return r.createAutoScalingListenerForRunnerSet(ctx, autoscalingRunnerSet, latestRunnerSet, log) | 		return r.createAutoScalingListenerForRunnerSet(ctx, autoscalingRunnerSet, latestRunnerSet, secret, log) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Update the status of autoscaling runner set.
 | 	// Update the status of autoscaling runner set.
 | ||||||
|  | @ -643,7 +643,13 @@ func (r *AutoscalingRunnerSetReconciler) createEphemeralRunnerSet(ctx context.Co | ||||||
| 	return ctrl.Result{}, nil | 	return ctrl.Result{}, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *AutoscalingRunnerSetReconciler) createAutoScalingListenerForRunnerSet(ctx context.Context, autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, log logr.Logger) (ctrl.Result, error) { | func (r *AutoscalingRunnerSetReconciler) createAutoScalingListenerForRunnerSet( | ||||||
|  | 	ctx context.Context, | ||||||
|  | 	autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, | ||||||
|  | 	ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, | ||||||
|  | 	githubSecret *corev1.Secret, | ||||||
|  | 	log logr.Logger, | ||||||
|  | ) (ctrl.Result, error) { | ||||||
| 	var imagePullSecrets []corev1.LocalObjectReference | 	var imagePullSecrets []corev1.LocalObjectReference | ||||||
| 	for _, imagePullSecret := range r.DefaultRunnerScaleSetListenerImagePullSecrets { | 	for _, imagePullSecret := range r.DefaultRunnerScaleSetListenerImagePullSecrets { | ||||||
| 		imagePullSecrets = append(imagePullSecrets, corev1.LocalObjectReference{ | 		imagePullSecrets = append(imagePullSecrets, corev1.LocalObjectReference{ | ||||||
|  | @ -651,7 +657,14 @@ func (r *AutoscalingRunnerSetReconciler) createAutoScalingListenerForRunnerSet(c | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	autoscalingListener, err := r.ResourceBuilder.newAutoScalingListener(autoscalingRunnerSet, ephemeralRunnerSet, r.ControllerNamespace, r.DefaultRunnerScaleSetListenerImage, imagePullSecrets) | 	autoscalingListener, err := r.ResourceBuilder.newAutoScalingListener( | ||||||
|  | 		autoscalingRunnerSet, | ||||||
|  | 		ephemeralRunnerSet, | ||||||
|  | 		githubSecret, | ||||||
|  | 		r.ControllerNamespace, | ||||||
|  | 		r.DefaultRunnerScaleSetListenerImage, | ||||||
|  | 		imagePullSecrets, | ||||||
|  | 	) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error(err, "Could not create AutoscalingListener spec") | 		log.Error(err, "Could not create AutoscalingListener spec") | ||||||
| 		return ctrl.Result{}, err | 		return ctrl.Result{}, err | ||||||
|  |  | ||||||
|  | @ -476,6 +476,101 @@ var _ = Describe("Test AutoScalingRunnerSet controller", Ordered, func() { | ||||||
| 				autoscalingRunnerSetTestInterval, | 				autoscalingRunnerSetTestInterval, | ||||||
| 			).Should(BeEquivalentTo("testgroup2"), "AutoScalingRunnerSet should have the runner group in its annotation") | 			).Should(BeEquivalentTo("testgroup2"), "AutoScalingRunnerSet should have the runner group in its annotation") | ||||||
| 		}) | 		}) | ||||||
|  | 
 | ||||||
|  | 		It("should re-create the listener when the github secret changes", func() { | ||||||
|  | 			// Wait till the listener is created
 | ||||||
|  | 			listener := new(v1alpha1.AutoscalingListener) | ||||||
|  | 			Eventually( | ||||||
|  | 				func() error { | ||||||
|  | 					return k8sClient.Get(ctx, client.ObjectKey{Name: scaleSetListenerName(autoscalingRunnerSet), Namespace: autoscalingRunnerSet.Namespace}, listener) | ||||||
|  | 				}, | ||||||
|  | 				autoscalingRunnerSetTestTimeout, | ||||||
|  | 				autoscalingRunnerSetTestInterval, | ||||||
|  | 			).Should(Succeed(), "Listener should be created") | ||||||
|  | 
 | ||||||
|  | 			actionsClient, err := controller.actionsClientFor(ctx, autoscalingRunnerSet) | ||||||
|  | 			Expect(err).NotTo(HaveOccurred(), "failed to get actions client") | ||||||
|  | 
 | ||||||
|  | 			listenerCreationTimestamp := listener.ObjectMeta.CreationTimestamp | ||||||
|  | 			listenerHash := listener.ObjectMeta.Annotations[annotationKeyRunnerSpecHash] | ||||||
|  | 
 | ||||||
|  | 			githubSecret := new(corev1.Secret) | ||||||
|  | 			Eventually( | ||||||
|  | 				func() error { | ||||||
|  | 					return k8sClient.Get( | ||||||
|  | 						ctx, | ||||||
|  | 						client.ObjectKey{ | ||||||
|  | 							Name:      configSecret.ObjectMeta.Name, | ||||||
|  | 							Namespace: configSecret.ObjectMeta.Namespace, | ||||||
|  | 						}, | ||||||
|  | 						githubSecret, | ||||||
|  | 					) | ||||||
|  | 				}, | ||||||
|  | 				autoscalingRunnerSetTestTimeout, | ||||||
|  | 				autoscalingRunnerSetTestInterval, | ||||||
|  | 			).Should(Succeed(), "Failed to fetch the github secret") | ||||||
|  | 
 | ||||||
|  | 			githubSecret.Data["update"] = []byte("update") | ||||||
|  | 			err = k8sClient.Update(ctx, githubSecret) | ||||||
|  | 			Expect(err).NotTo(HaveOccurred(), "failed to update the github secret") | ||||||
|  | 
 | ||||||
|  | 			updatedGitHubSecret := new(corev1.Secret) | ||||||
|  | 			Eventually( | ||||||
|  | 				func() error { | ||||||
|  | 					err := k8sClient.Get( | ||||||
|  | 						ctx, | ||||||
|  | 						client.ObjectKey{ | ||||||
|  | 							Name:      configSecret.ObjectMeta.Name, | ||||||
|  | 							Namespace: configSecret.ObjectMeta.Namespace, | ||||||
|  | 						}, | ||||||
|  | 						updatedGitHubSecret, | ||||||
|  | 					) | ||||||
|  | 					if err != nil { | ||||||
|  | 						return err | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					if _, ok := updatedGitHubSecret.Data["update"]; !ok { | ||||||
|  | 						return fmt.Errorf("secret update not yet present") | ||||||
|  | 					} | ||||||
|  | 					return nil | ||||||
|  | 				}, | ||||||
|  | 				autoscalingRunnerSetTestTimeout, | ||||||
|  | 				autoscalingRunnerSetTestInterval, | ||||||
|  | 			).Should(Succeed(), "Failed to eventually figure out github secret data update") | ||||||
|  | 
 | ||||||
|  | 			updatedListener := new(v1alpha1.AutoscalingListener) | ||||||
|  | 			Eventually( | ||||||
|  | 				func() error { | ||||||
|  | 					err := k8sClient.Get( | ||||||
|  | 						ctx, | ||||||
|  | 						client.ObjectKey{ | ||||||
|  | 							Name:      scaleSetListenerName(autoscalingRunnerSet), | ||||||
|  | 							Namespace: autoscalingRunnerSet.Namespace, | ||||||
|  | 						}, | ||||||
|  | 						listener, | ||||||
|  | 					) | ||||||
|  | 					if err != nil { | ||||||
|  | 						return err | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					if updatedListener.CreationTimestamp == listenerCreationTimestamp { | ||||||
|  | 						return fmt.Errorf("creation timestamp not updated yet") | ||||||
|  | 					} | ||||||
|  | 					if updatedListener.Annotations[annotationKeyRunnerSpecHash] == listenerHash { | ||||||
|  | 						return fmt.Errorf("hash not updated yet") | ||||||
|  | 					} | ||||||
|  | 
 | ||||||
|  | 					return nil | ||||||
|  | 				}, | ||||||
|  | 				autoscalingRunnerSetTestTimeout, | ||||||
|  | 				autoscalingRunnerSetTestInterval, | ||||||
|  | 			).Should(Succeed(), "Listener should be re-created") | ||||||
|  | 
 | ||||||
|  | 			actionsClientAfterUpdate, err := controller.actionsClientFor(ctx, autoscalingRunnerSet) | ||||||
|  | 			Expect(err).NotTo(HaveOccurred(), "failed to get actions client") | ||||||
|  | 
 | ||||||
|  | 			Expect(actionsClientAfterUpdate.(*fake.FakeClient).ID).NotTo(BeEquivalentTo(actionsClient.(*fake.FakeClient).ID), "expected new client to be used") | ||||||
|  | 		}) | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	Context("When updating an AutoscalingRunnerSet with running or pending jobs", func() { | 	Context("When updating an AutoscalingRunnerSet with running or pending jobs", func() { | ||||||
|  |  | ||||||
|  | @ -78,7 +78,13 @@ func boolPtr(v bool) *bool { | ||||||
| 	return &v | 	return &v | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (b *ResourceBuilder) newAutoScalingListener(autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, namespace, image string, imagePullSecrets []corev1.LocalObjectReference) (*v1alpha1.AutoscalingListener, error) { | func (b *ResourceBuilder) newAutoScalingListener( | ||||||
|  | 	autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, | ||||||
|  | 	ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet, | ||||||
|  | 	githubSecret *corev1.Secret, | ||||||
|  | 	namespace, image string, | ||||||
|  | 	imagePullSecrets []corev1.LocalObjectReference, | ||||||
|  | ) (*v1alpha1.AutoscalingListener, error) { | ||||||
| 	runnerScaleSetId, err := strconv.Atoi(autoscalingRunnerSet.Annotations[runnerScaleSetIdAnnotationKey]) | 	runnerScaleSetId, err := strconv.Atoi(autoscalingRunnerSet.Annotations[runnerScaleSetIdAnnotationKey]) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | @ -102,7 +108,7 @@ func (b *ResourceBuilder) newAutoScalingListener(autoscalingRunnerSet *v1alpha1. | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	annotations := map[string]string{ | 	annotations := map[string]string{ | ||||||
| 		annotationKeyRunnerSpecHash: autoscalingRunnerSet.ListenerSpecHash(), | 		annotationKeyRunnerSpecHash: autoscalingRunnerSet.ListenerSpecHash(githubSecret), | ||||||
| 		annotationKeyValuesHash:     autoscalingRunnerSet.Annotations[annotationKeyValuesHash], | 		annotationKeyValuesHash:     autoscalingRunnerSet.Annotations[annotationKeyValuesHash], | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -59,7 +59,24 @@ func TestLabelPropagation(t *testing.T) { | ||||||
| 	assert.Equal(t, autoscalingRunnerSet.Annotations[AnnotationKeyGitHubRunnerScaleSetName], ephemeralRunnerSet.Annotations[AnnotationKeyGitHubRunnerScaleSetName]) | 	assert.Equal(t, autoscalingRunnerSet.Annotations[AnnotationKeyGitHubRunnerScaleSetName], ephemeralRunnerSet.Annotations[AnnotationKeyGitHubRunnerScaleSetName]) | ||||||
| 	assert.Equal(t, autoscalingRunnerSet.Labels["arbitrary-label"], ephemeralRunnerSet.Labels["arbitrary-label"]) | 	assert.Equal(t, autoscalingRunnerSet.Labels["arbitrary-label"], ephemeralRunnerSet.Labels["arbitrary-label"]) | ||||||
| 
 | 
 | ||||||
| 	listener, err := b.newAutoScalingListener(&autoscalingRunnerSet, ephemeralRunnerSet, autoscalingRunnerSet.Namespace, "test:latest", nil) | 	githubSecret := &corev1.Secret{ | ||||||
|  | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 			Name:      "test-scale-set", | ||||||
|  | 			Namespace: "test-ns", | ||||||
|  | 		}, | ||||||
|  | 		Data: map[string][]byte{ | ||||||
|  | 			"github_token": []byte("github_token"), | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	listener, err := b.newAutoScalingListener( | ||||||
|  | 		&autoscalingRunnerSet, | ||||||
|  | 		ephemeralRunnerSet, | ||||||
|  | 		githubSecret, | ||||||
|  | 		autoscalingRunnerSet.Namespace, | ||||||
|  | 		"test:latest", | ||||||
|  | 		nil, | ||||||
|  | 	) | ||||||
| 	require.NoError(t, err) | 	require.NoError(t, err) | ||||||
| 	assert.Equal(t, labelValueKubernetesPartOf, listener.Labels[LabelKeyKubernetesPartOf]) | 	assert.Equal(t, labelValueKubernetesPartOf, listener.Labels[LabelKeyKubernetesPartOf]) | ||||||
| 	assert.Equal(t, "runner-scale-set-listener", listener.Labels[LabelKeyKubernetesComponent]) | 	assert.Equal(t, "runner-scale-set-listener", listener.Labels[LabelKeyKubernetesComponent]) | ||||||
|  | @ -120,6 +137,16 @@ func TestGitHubURLTrimLabelValues(t *testing.T) { | ||||||
| 	organization := strings.Repeat("b", 64) | 	organization := strings.Repeat("b", 64) | ||||||
| 	repository := strings.Repeat("c", 64) | 	repository := strings.Repeat("c", 64) | ||||||
| 
 | 
 | ||||||
|  | 	githubSecret := &corev1.Secret{ | ||||||
|  | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 			Name:      "test-scale-set", | ||||||
|  | 			Namespace: "test-ns", | ||||||
|  | 		}, | ||||||
|  | 		Data: map[string][]byte{ | ||||||
|  | 			"github_token": []byte("github_token"), | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	autoscalingRunnerSet := v1alpha1.AutoscalingRunnerSet{ | 	autoscalingRunnerSet := v1alpha1.AutoscalingRunnerSet{ | ||||||
| 		ObjectMeta: metav1.ObjectMeta{ | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
| 			Name:      "test-scale-set", | 			Name:      "test-scale-set", | ||||||
|  | @ -151,7 +178,14 @@ func TestGitHubURLTrimLabelValues(t *testing.T) { | ||||||
| 		assert.True(t, strings.HasSuffix(ephemeralRunnerSet.Labels[LabelKeyGitHubOrganization], trimLabelVauleSuffix)) | 		assert.True(t, strings.HasSuffix(ephemeralRunnerSet.Labels[LabelKeyGitHubOrganization], trimLabelVauleSuffix)) | ||||||
| 		assert.True(t, strings.HasSuffix(ephemeralRunnerSet.Labels[LabelKeyGitHubRepository], trimLabelVauleSuffix)) | 		assert.True(t, strings.HasSuffix(ephemeralRunnerSet.Labels[LabelKeyGitHubRepository], trimLabelVauleSuffix)) | ||||||
| 
 | 
 | ||||||
| 		listener, err := b.newAutoScalingListener(autoscalingRunnerSet, ephemeralRunnerSet, autoscalingRunnerSet.Namespace, "test:latest", nil) | 		listener, err := b.newAutoScalingListener( | ||||||
|  | 			autoscalingRunnerSet, | ||||||
|  | 			ephemeralRunnerSet, | ||||||
|  | 			githubSecret, | ||||||
|  | 			autoscalingRunnerSet.Namespace, | ||||||
|  | 			"test:latest", | ||||||
|  | 			nil, | ||||||
|  | 		) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		assert.Len(t, listener.Labels[LabelKeyGitHubEnterprise], 0) | 		assert.Len(t, listener.Labels[LabelKeyGitHubEnterprise], 0) | ||||||
| 		assert.Len(t, listener.Labels[LabelKeyGitHubOrganization], 63) | 		assert.Len(t, listener.Labels[LabelKeyGitHubOrganization], 63) | ||||||
|  | @ -174,7 +208,14 @@ func TestGitHubURLTrimLabelValues(t *testing.T) { | ||||||
| 		assert.Len(t, ephemeralRunnerSet.Labels[LabelKeyGitHubOrganization], 0) | 		assert.Len(t, ephemeralRunnerSet.Labels[LabelKeyGitHubOrganization], 0) | ||||||
| 		assert.Len(t, ephemeralRunnerSet.Labels[LabelKeyGitHubRepository], 0) | 		assert.Len(t, ephemeralRunnerSet.Labels[LabelKeyGitHubRepository], 0) | ||||||
| 
 | 
 | ||||||
| 		listener, err := b.newAutoScalingListener(autoscalingRunnerSet, ephemeralRunnerSet, autoscalingRunnerSet.Namespace, "test:latest", nil) | 		listener, err := b.newAutoScalingListener( | ||||||
|  | 			autoscalingRunnerSet, | ||||||
|  | 			ephemeralRunnerSet, | ||||||
|  | 			githubSecret, | ||||||
|  | 			autoscalingRunnerSet.Namespace, | ||||||
|  | 			"test:latest", | ||||||
|  | 			nil, | ||||||
|  | 		) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		assert.Len(t, listener.Labels[LabelKeyGitHubEnterprise], 63) | 		assert.Len(t, listener.Labels[LabelKeyGitHubEnterprise], 63) | ||||||
| 		assert.True(t, strings.HasSuffix(ephemeralRunnerSet.Labels[LabelKeyGitHubEnterprise], trimLabelVauleSuffix)) | 		assert.True(t, strings.HasSuffix(ephemeralRunnerSet.Labels[LabelKeyGitHubEnterprise], trimLabelVauleSuffix)) | ||||||
|  |  | ||||||
|  | @ -123,6 +123,7 @@ var defaultRunnerScaleSetJitRunnerConfig = &actions.RunnerScaleSetJitRunnerConfi | ||||||
| 
 | 
 | ||||||
| // FakeClient implements actions service
 | // FakeClient implements actions service
 | ||||||
| type FakeClient struct { | type FakeClient struct { | ||||||
|  | 	id                      uuid.UUID | ||||||
| 	getRunnerScaleSetResult struct { | 	getRunnerScaleSetResult struct { | ||||||
| 		*actions.RunnerScaleSet | 		*actions.RunnerScaleSet | ||||||
| 		err error | 		err error | ||||||
|  | @ -191,7 +192,9 @@ type FakeClient struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewFakeClient(options ...Option) actions.ActionsService { | func NewFakeClient(options ...Option) actions.ActionsService { | ||||||
| 	f := &FakeClient{} | 	f := &FakeClient{ | ||||||
|  | 		id: uuid.New(), | ||||||
|  | 	} | ||||||
| 	f.applyDefaults() | 	f.applyDefaults() | ||||||
| 	for _, opt := range options { | 	for _, opt := range options { | ||||||
| 		opt(f) | 		opt(f) | ||||||
|  | @ -199,6 +202,10 @@ func NewFakeClient(options ...Option) actions.ActionsService { | ||||||
| 	return f | 	return f | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (f *FakeClient) ID() uuid.UUID { | ||||||
|  | 	return f.id | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (f *FakeClient) applyDefaults() { | func (f *FakeClient) applyDefaults() { | ||||||
| 	f.getRunnerScaleSetResult.RunnerScaleSet = defaultRunnerScaleSet | 	f.getRunnerScaleSetResult.RunnerScaleSet = defaultRunnerScaleSet | ||||||
| 	f.getRunnerScaleSetByIdResult.RunnerScaleSet = defaultRunnerScaleSet | 	f.getRunnerScaleSetByIdResult.RunnerScaleSet = defaultRunnerScaleSet | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										25
									
								
								go.mod
								
								
								
								
							|  | @ -1,6 +1,7 @@ | ||||||
| module github.com/actions/actions-runner-controller | module github.com/actions/actions-runner-controller | ||||||
| 
 | 
 | ||||||
| go 1.24.0 | go 1.24.0 | ||||||
|  | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/bradleyfalzon/ghinstallation/v2 v2.14.0 | 	github.com/bradleyfalzon/ghinstallation/v2 v2.14.0 | ||||||
| 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc | 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc | ||||||
|  | @ -16,16 +17,16 @@ require ( | ||||||
| 	github.com/hashicorp/go-retryablehttp v0.7.7 | 	github.com/hashicorp/go-retryablehttp v0.7.7 | ||||||
| 	github.com/kelseyhightower/envconfig v1.4.0 | 	github.com/kelseyhightower/envconfig v1.4.0 | ||||||
| 	github.com/onsi/ginkgo v1.16.5 | 	github.com/onsi/ginkgo v1.16.5 | ||||||
| 	github.com/onsi/ginkgo/v2 v2.23.3 | 	github.com/onsi/ginkgo/v2 v2.23.4 | ||||||
| 	github.com/onsi/gomega v1.36.3 | 	github.com/onsi/gomega v1.37.0 | ||||||
| 	github.com/prometheus/client_golang v1.21.1 | 	github.com/prometheus/client_golang v1.21.1 | ||||||
| 	github.com/stretchr/testify v1.10.0 | 	github.com/stretchr/testify v1.10.0 | ||||||
| 	github.com/teambition/rrule-go v1.8.2 | 	github.com/teambition/rrule-go v1.8.2 | ||||||
| 	go.uber.org/multierr v1.11.0 | 	go.uber.org/multierr v1.11.0 | ||||||
| 	go.uber.org/zap v1.27.0 | 	go.uber.org/zap v1.27.0 | ||||||
| 	golang.org/x/net v0.38.0 | 	golang.org/x/net v0.39.0 | ||||||
| 	golang.org/x/oauth2 v0.28.0 | 	golang.org/x/oauth2 v0.28.0 | ||||||
| 	golang.org/x/sync v0.12.0 | 	golang.org/x/sync v0.13.0 | ||||||
| 	gomodules.xyz/jsonpatch/v2 v2.5.0 | 	gomodules.xyz/jsonpatch/v2 v2.5.0 | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 | 	gopkg.in/yaml.v2 v2.4.0 | ||||||
| 	k8s.io/api v0.32.3 | 	k8s.io/api v0.32.3 | ||||||
|  | @ -92,6 +93,7 @@ require ( | ||||||
| 	github.com/go-openapi/jsonreference v0.21.0 // indirect | 	github.com/go-openapi/jsonreference v0.21.0 // indirect | ||||||
| 	github.com/go-openapi/swag v0.23.0 // indirect | 	github.com/go-openapi/swag v0.23.0 // indirect | ||||||
| 	github.com/go-sql-driver/mysql v1.9.0 // indirect | 	github.com/go-sql-driver/mysql v1.9.0 // indirect | ||||||
|  | 	github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect | ||||||
| 	github.com/go-task/slim-sprig/v3 v3.0.0 // indirect | 	github.com/go-task/slim-sprig/v3 v3.0.0 // indirect | ||||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | 	github.com/gogo/protobuf v1.3.2 // indirect | ||||||
| 	github.com/golang/protobuf v1.5.4 // indirect | 	github.com/golang/protobuf v1.5.4 // indirect | ||||||
|  | @ -106,7 +108,7 @@ require ( | ||||||
| 	github.com/google/go-github/v69 v69.2.0 // indirect | 	github.com/google/go-github/v69 v69.2.0 // indirect | ||||||
| 	github.com/google/go-querystring v1.1.0 // indirect | 	github.com/google/go-querystring v1.1.0 // indirect | ||||||
| 	github.com/google/gofuzz v1.2.0 // indirect | 	github.com/google/gofuzz v1.2.0 // indirect | ||||||
| 	github.com/google/pprof v0.0.0-20250302191652-9094ed2288e7 // indirect | 	github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect | ||||||
| 	github.com/gorilla/websocket v1.5.3 // indirect | 	github.com/gorilla/websocket v1.5.3 // indirect | ||||||
| 	github.com/gruntwork-io/go-commons v0.17.2 // indirect | 	github.com/gruntwork-io/go-commons v0.17.2 // indirect | ||||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||||
|  | @ -133,6 +135,7 @@ require ( | ||||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||||
| 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect | 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect | ||||||
| 	github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect | 	github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect | ||||||
|  | 	github.com/nxadm/tail v1.4.8 // indirect | ||||||
| 	github.com/pkg/errors v0.9.1 // indirect | 	github.com/pkg/errors v0.9.1 // indirect | ||||||
| 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect | 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect | ||||||
| 	github.com/pquerna/otp v1.4.0 // indirect | 	github.com/pquerna/otp v1.4.0 // indirect | ||||||
|  | @ -148,16 +151,18 @@ require ( | ||||||
| 	github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 // indirect | 	github.com/virtuald/go-ordered-json v0.0.0-20170621173500-b18e6e673d74 // indirect | ||||||
| 	github.com/x448/float16 v0.8.4 // indirect | 	github.com/x448/float16 v0.8.4 // indirect | ||||||
| 	github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect | 	github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect | ||||||
| 	golang.org/x/crypto v0.36.0 // indirect | 	go.uber.org/automaxprocs v1.6.0 // indirect | ||||||
|  | 	golang.org/x/crypto v0.37.0 // indirect | ||||||
| 	golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect | 	golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect | ||||||
| 	golang.org/x/sys v0.31.0 // indirect | 	golang.org/x/sys v0.32.0 // indirect | ||||||
| 	golang.org/x/term v0.30.0 // indirect | 	golang.org/x/term v0.31.0 // indirect | ||||||
| 	golang.org/x/text v0.23.0 // indirect | 	golang.org/x/text v0.24.0 // indirect | ||||||
| 	golang.org/x/time v0.11.0 // indirect | 	golang.org/x/time v0.11.0 // indirect | ||||||
| 	golang.org/x/tools v0.31.0 // indirect | 	golang.org/x/tools v0.32.0 // indirect | ||||||
| 	google.golang.org/protobuf v1.36.5 // indirect | 	google.golang.org/protobuf v1.36.5 // indirect | ||||||
| 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect | 	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect | ||||||
| 	gopkg.in/inf.v0 v0.9.1 // indirect | 	gopkg.in/inf.v0 v0.9.1 // indirect | ||||||
|  | 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect | ||||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| 	k8s.io/apiextensions-apiserver v0.32.2 // indirect | 	k8s.io/apiextensions-apiserver v0.32.2 // indirect | ||||||
| 	k8s.io/klog/v2 v2.130.1 // indirect | 	k8s.io/klog/v2 v2.130.1 // indirect | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										25
									
								
								go.sum
								
								
								
								
							|  | @ -127,6 +127,7 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr | ||||||
| github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= | github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= | ||||||
| github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= | github.com/go-sql-driver/mysql v1.9.0 h1:Y0zIbQXhQKmQgTp44Y1dp3wTXcn804QoTptLZT1vtvo= | ||||||
| github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= | github.com/go-sql-driver/mysql v1.9.0/go.mod h1:pDetrLJeA3oMujJuvXc8RJoasr589B6A9fwzD3QMrqw= | ||||||
|  | github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= | ||||||
| github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= | github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= | ||||||
| github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= | github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= | ||||||
| github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= | github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= | ||||||
|  | @ -177,6 +178,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= | ||||||
| github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
| github.com/google/pprof v0.0.0-20250302191652-9094ed2288e7 h1:+J3r2e8+RsmN3vKfo75g0YSY61ms37qzPglu4p0sGro= | github.com/google/pprof v0.0.0-20250302191652-9094ed2288e7 h1:+J3r2e8+RsmN3vKfo75g0YSY61ms37qzPglu4p0sGro= | ||||||
| github.com/google/pprof v0.0.0-20250302191652-9094ed2288e7/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= | github.com/google/pprof v0.0.0-20250302191652-9094ed2288e7/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= | ||||||
|  | github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= | ||||||
|  | github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= | ||||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= | github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= | ||||||
|  | @ -258,6 +261,7 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m | ||||||
| github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= | github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= | ||||||
| github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= | github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= | ||||||
| github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= | ||||||
|  | github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= | ||||||
| github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= | github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= | ||||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||||
| github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= | ||||||
|  | @ -265,10 +269,14 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= | ||||||
| github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= | github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= | ||||||
| github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= | github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= | ||||||
| github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= | github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= | ||||||
|  | github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= | ||||||
|  | github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= | ||||||
| github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | ||||||
| github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= | ||||||
| github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= | github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= | ||||||
| github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= | github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= | ||||||
|  | github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= | ||||||
|  | github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= | ||||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | @ -315,6 +323,8 @@ github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGC | ||||||
| github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= | github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= | ||||||
| github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
| github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
|  | go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= | ||||||
|  | go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= | ||||||
| go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | ||||||
| go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | ||||||
| go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= | go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= | ||||||
|  | @ -326,6 +336,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U | ||||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= | golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= | ||||||
| golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= | golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= | ||||||
|  | golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= | ||||||
|  | golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= | ||||||
| golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= | golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= | ||||||
| golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= | golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= | ||||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
|  | @ -338,6 +350,8 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ | ||||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||||
| golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= | golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= | ||||||
| golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= | golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= | ||||||
|  | golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= | ||||||
|  | golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= | ||||||
| golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= | golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= | ||||||
| golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= | golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= | ||||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | @ -346,6 +360,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ | ||||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= | golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= | ||||||
| golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | ||||||
|  | golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= | ||||||
|  | golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= | ||||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | @ -358,12 +374,18 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w | ||||||
| golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= | golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= | ||||||
| golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||||
|  | golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= | ||||||
|  | golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= | ||||||
| golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= | golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= | ||||||
| golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= | golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= | ||||||
|  | golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= | ||||||
|  | golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= | ||||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= | golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= | ||||||
| golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= | golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= | ||||||
|  | golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= | ||||||
|  | golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= | ||||||
| golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= | golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= | ||||||
| golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= | golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
|  | @ -373,6 +395,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f | ||||||
| golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||||
| golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= | golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= | ||||||
| golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= | golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= | ||||||
|  | golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= | ||||||
|  | golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | @ -396,6 +420,7 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWM | ||||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||||
| gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= | gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= | ||||||
| gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||||
|  | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | ||||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								hash/hash.go
								
								
								
								
							
							
						
						
									
										19
									
								
								hash/hash.go
								
								
								
								
							|  | @ -49,3 +49,22 @@ func ComputeTemplateHash(template interface{}) string { | ||||||
| 
 | 
 | ||||||
| 	return rand.SafeEncodeString(fmt.Sprint(hasher.Sum32())) | 	return rand.SafeEncodeString(fmt.Sprint(hasher.Sum32())) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func ComputeCombinedObjectsHash(first any, others ...any) string { | ||||||
|  | 	hasher := fnv.New32a() | ||||||
|  | 
 | ||||||
|  | 	hasher.Reset() | ||||||
|  | 
 | ||||||
|  | 	printer := spew.ConfigState{ | ||||||
|  | 		Indent:         " ", | ||||||
|  | 		SortKeys:       true, | ||||||
|  | 		DisableMethods: true, | ||||||
|  | 		SpewKeys:       true, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, obj := range append([]any{first}, others...) { | ||||||
|  | 		printer.Fprintf(hasher, "%#v", obj) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return rand.SafeEncodeString(fmt.Sprint(hasher.Sum32())) | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue