diff --git a/internal/k8s/gatewayclient/gatewayclient.go b/internal/k8s/gatewayclient/gatewayclient.go index b2c95edf2..424cfd87c 100644 --- a/internal/k8s/gatewayclient/gatewayclient.go +++ b/internal/k8s/gatewayclient/gatewayclient.go @@ -38,6 +38,7 @@ type Client interface { GetTCPRoutesInNamespace(ctx context.Context, ns string) ([]gateway.TCPRoute, error) GetMeshService(ctx context.Context, key types.NamespacedName) (*apigwv1alpha1.MeshService, error) GetNamespace(ctx context.Context, key types.NamespacedName) (*core.Namespace, error) + GetDeployment(ctx context.Context, key types.NamespacedName) (*apps.Deployment, error) // finalizer helpers @@ -230,6 +231,17 @@ func (g *gatewayClient) GetService(ctx context.Context, key types.NamespacedName return svc, nil } +func (g *gatewayClient) GetDeployment(ctx context.Context, key types.NamespacedName) (*apps.Deployment, error) { + depl := &apps.Deployment{} + if err := g.Client.Get(ctx, key, depl); err != nil { + if k8serrors.IsNotFound(err) { + return nil, nil + } + return nil, NewK8sError(err) + } + return depl, nil +} + func (g *gatewayClient) GetSecret(ctx context.Context, key types.NamespacedName) (*core.Secret, error) { secret := &core.Secret{} if err := g.Client.Get(ctx, key, secret); err != nil { diff --git a/internal/k8s/gatewayclient/mocks/gatewayclient.go b/internal/k8s/gatewayclient/mocks/gatewayclient.go index b6bf13f2d..b2c54cdcd 100644 --- a/internal/k8s/gatewayclient/mocks/gatewayclient.go +++ b/internal/k8s/gatewayclient/mocks/gatewayclient.go @@ -199,6 +199,21 @@ func (mr *MockClientMockRecorder) GetConfigForGatewayClassName(ctx, name interfa return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetConfigForGatewayClassName", reflect.TypeOf((*MockClient)(nil).GetConfigForGatewayClassName), ctx, name) } +// GetDeployment mocks base method. +func (m *MockClient) GetDeployment(ctx context.Context, key types.NamespacedName) (*v1.Deployment, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDeployment", ctx, key) + ret0, _ := ret[0].(*v1.Deployment) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDeployment indicates an expected call of GetDeployment. +func (mr *MockClientMockRecorder) GetDeployment(ctx, key interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeployment", reflect.TypeOf((*MockClient)(nil).GetDeployment), ctx, key) +} + // GetGateway mocks base method. func (m *MockClient) GetGateway(ctx context.Context, key types.NamespacedName) (*v1alpha2.Gateway, error) { m.ctrl.T.Helper() diff --git a/internal/k8s/reconciler/gateway.go b/internal/k8s/reconciler/gateway.go index d02c36fcc..053e4a4fb 100644 --- a/internal/k8s/reconciler/gateway.go +++ b/internal/k8s/reconciler/gateway.go @@ -464,7 +464,12 @@ func (g *K8sGateway) ensureDeploymentExists(ctx context.Context) error { deployment := g.deploymentBuilder.Build() mutated := deployment.DeepCopy() - mutated = apigwv1alpha1.MergeDeployment(deployment, mutated) + + currentDeployment, err := g.client.GetDeployment(ctx, types.NamespacedName{Namespace: deployment.Namespace, Name: deployment.Name}) + if err != nil { + return err + } + mutated = apigwv1alpha1.MergeDeployment(deployment, mutated, currentDeployment.Spec.Replicas) if updated, err := g.client.CreateOrUpdateDeployment(ctx, mutated, func() error { return g.client.SetControllerOwnership(g.gateway, mutated) diff --git a/pkg/apis/v1alpha1/types.go b/pkg/apis/v1alpha1/types.go index 64b598cbc..08f48d91a 100644 --- a/pkg/apis/v1alpha1/types.go +++ b/pkg/apis/v1alpha1/types.go @@ -205,10 +205,15 @@ func compareServices(a, b *corev1.Service) bool { // MergeDeploymentmerges a gateway deployment a onto b and returns b, overriding all of // the fields that we'd normally set for a service deployment. It does not attempt // to change the service type -func MergeDeployment(a, b *appsv1.Deployment) *appsv1.Deployment { +func MergeDeployment(a, b *appsv1.Deployment, currentReplicas *int32) *appsv1.Deployment { if !compareDeployments(a, b) { b.Spec.Template = a.Spec.Template - b.Spec.Replicas = a.Spec.Replicas + + //Dont override if replicas have already been set on deployment + //TODO this logic will likely need to be updated as part of CAPIGW-137 + if currentReplicas == nil { + b.Spec.Replicas = a.Spec.Replicas + } } return b