add namespace to kubectl requests (#315)

* add namespace to kubectl requests

* Add tests for missing/wrong namespace

Co-authored-by: Otto Bittner <cobittner@posteo.net>
This commit is contained in:
3u13r 2022-07-28 16:07:29 +02:00 committed by GitHub
parent c37fab0a4c
commit e0ce2e8a51
6 changed files with 43 additions and 27 deletions

View file

@ -101,14 +101,14 @@ func (c *Client) CreateConfigMap(ctx context.Context, configMap corev1.ConfigMap
return nil return nil
} }
func (c *Client) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string) error { func (c *Client) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string, namespace string) error {
deployments := c.clientset.AppsV1().Deployments(corev1.NamespaceAll) deployments := c.clientset.AppsV1().Deployments(namespace)
// retry resource update if an error occurs // retry resource update if an error occurs
err := retry.RetryOnConflict(retry.DefaultRetry, func() error { err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
result, err := deployments.Get(ctx, name, metav1.GetOptions{}) result, err := deployments.Get(ctx, name, metav1.GetOptions{})
if err != nil { if err != nil {
return fmt.Errorf("Failed to get latest version of Deployment: %v", err) return fmt.Errorf("failed to get Deployment to add toleration: %v", err)
} }
result.Spec.Template.Spec.Tolerations = append(result.Spec.Template.Spec.Tolerations, tolerations...) result.Spec.Template.Spec.Tolerations = append(result.Spec.Template.Spec.Tolerations, tolerations...)
@ -123,14 +123,14 @@ func (c *Client) AddTolerationsToDeployment(ctx context.Context, tolerations []c
return nil return nil
} }
func (c *Client) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string) error { func (c *Client) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string, namespace string) error {
deployments := c.clientset.AppsV1().Deployments(corev1.NamespaceAll) deployments := c.clientset.AppsV1().Deployments(namespace)
// retry resource update if an error occurs // retry resource update if an error occurs
err := retry.RetryOnConflict(retry.DefaultRetry, func() error { err := retry.RetryOnConflict(retry.DefaultRetry, func() error {
result, err := deployments.Get(ctx, name, metav1.GetOptions{}) result, err := deployments.Get(ctx, name, metav1.GetOptions{})
if err != nil { if err != nil {
return fmt.Errorf("Failed to get latest version of Deployment: %v", err) return fmt.Errorf("failed to get Deployment to add node selector: %v", err)
} }
for k, v := range selectors { for k, v := range selectors {

View file

@ -77,12 +77,14 @@ var (
} }
tolerationsDeployment = appsv1.Deployment{ tolerationsDeployment = appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-deployment", Namespace: "test-ns",
Name: "test-deployment",
}, },
} }
selectorsDeployment = appsv1.Deployment{ selectorsDeployment = appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-deployment", Namespace: "test-ns",
Name: "test-deployment",
}, },
Spec: appsv1.DeploymentSpec{ Spec: appsv1.DeploymentSpec{
Template: k8s.PodTemplateSpec{ Template: k8s.PodTemplateSpec{
@ -300,15 +302,22 @@ func TestGetObjects(t *testing.T) {
func TestAddTolerationsToDeployment(t *testing.T) { func TestAddTolerationsToDeployment(t *testing.T) {
testCases := map[string]struct { testCases := map[string]struct {
namespace string
name string name string
tolerations []corev1.Toleration tolerations []corev1.Toleration
wantErr bool wantErr bool
}{ }{
"Success": { "Success": {
name: "test-deployment", namespace: "test-ns",
name: "test-deployment",
}, },
"Specifying non-existent deployment fails": { "Specifying non-existent deployment fails": {
name: "wrong-name", namespace: "test-ns",
name: "wrong-name",
wantErr: true,
},
"Wrong namespace": {
name: "test-deployment",
wantErr: true, wantErr: true,
}, },
} }
@ -319,7 +328,7 @@ func TestAddTolerationsToDeployment(t *testing.T) {
require := require.New(t) require := require.New(t)
client := newClientWithFakes(t, map[string]string{}, &tolerationsDeployment) client := newClientWithFakes(t, map[string]string{}, &tolerationsDeployment)
err := client.AddTolerationsToDeployment(context.Background(), tc.tolerations, tc.name) err := client.AddTolerationsToDeployment(context.Background(), tc.tolerations, tc.name, tc.namespace)
if tc.wantErr { if tc.wantErr {
assert.Error(err) assert.Error(err)
return return
@ -331,16 +340,23 @@ func TestAddTolerationsToDeployment(t *testing.T) {
func TestAddNodeSelectorsToDeployment(t *testing.T) { func TestAddNodeSelectorsToDeployment(t *testing.T) {
testCases := map[string]struct { testCases := map[string]struct {
namespace string
name string name string
selectors map[string]string selectors map[string]string
wantErr bool wantErr bool
}{ }{
"Success": { "Success": {
namespace: "test-ns",
name: "test-deployment", name: "test-deployment",
selectors: map[string]string{"some-key": "some-value"}, selectors: map[string]string{"some-key": "some-value"},
}, },
"Specifying non-existent deployment fails": { "Specifying non-existent deployment fails": {
name: "wrong-name", namespace: "test-ns",
name: "wrong-name",
wantErr: true,
},
"Wrong namespace": {
name: "test-deployment",
wantErr: true, wantErr: true,
}, },
} }
@ -351,7 +367,7 @@ func TestAddNodeSelectorsToDeployment(t *testing.T) {
require := require.New(t) require := require.New(t)
client := newClientWithFakes(t, map[string]string{}, &selectorsDeployment) client := newClientWithFakes(t, map[string]string{}, &selectorsDeployment)
err := client.AddNodeSelectorsToDeployment(context.Background(), tc.selectors, tc.name) err := client.AddNodeSelectorsToDeployment(context.Background(), tc.selectors, tc.name, tc.namespace)
if tc.wantErr { if tc.wantErr {
assert.Error(err) assert.Error(err)
return return

View file

@ -20,8 +20,8 @@ type Client interface {
// GetObjects converts resources into prepared info fields for use in ApplyOneObject. // GetObjects converts resources into prepared info fields for use in ApplyOneObject.
GetObjects(resources resources.Marshaler) ([]*resource.Info, error) GetObjects(resources resources.Marshaler) ([]*resource.Info, error)
CreateConfigMap(ctx context.Context, configMap corev1.ConfigMap) error CreateConfigMap(ctx context.Context, configMap corev1.ConfigMap) error
AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string) error AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string, namespace string) error
AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string) error AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string, namespace string) error
} }
// clientGenerator can generate new clients from a kubeconfig. // clientGenerator can generate new clients from a kubeconfig.
@ -86,26 +86,26 @@ func (k *Kubectl) CreateConfigMap(ctx context.Context, configMap corev1.ConfigMa
return nil return nil
} }
func (k *Kubectl) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string) error { func (k *Kubectl) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string, namespace string) error {
client, err := k.clientGenerator.NewClient(k.kubeconfig) client, err := k.clientGenerator.NewClient(k.kubeconfig)
if err != nil { if err != nil {
return err return err
} }
if err = client.AddTolerationsToDeployment(ctx, tolerations, name); err != nil { if err = client.AddTolerationsToDeployment(ctx, tolerations, name, namespace); err != nil {
return err return err
} }
return nil return nil
} }
func (k *Kubectl) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string) error { func (k *Kubectl) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string, namespace string) error {
client, err := k.clientGenerator.NewClient(k.kubeconfig) client, err := k.clientGenerator.NewClient(k.kubeconfig)
if err != nil { if err != nil {
return err return err
} }
if err = client.AddNodeSelectorsToDeployment(ctx, selectors, name); err != nil { if err = client.AddNodeSelectorsToDeployment(ctx, selectors, name, namespace); err != nil {
return err return err
} }

View file

@ -37,11 +37,11 @@ func (s *stubClient) CreateConfigMap(ctx context.Context, configMap corev1.Confi
return s.createConfigMapErr return s.createConfigMapErr
} }
func (s *stubClient) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string) error { func (s *stubClient) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string, namespace string) error {
return s.addTolerationsToDeploymentErr return s.addTolerationsToDeploymentErr
} }
func (s *stubClient) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string) error { func (s *stubClient) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string, namespace string) error {
return s.addNodeSelectorToDeploymentErr return s.addNodeSelectorToDeploymentErr
} }

View file

@ -45,8 +45,8 @@ type Client interface {
Apply(resources resources.Marshaler, forceConflicts bool) error Apply(resources resources.Marshaler, forceConflicts bool) error
SetKubeconfig(kubeconfig []byte) SetKubeconfig(kubeconfig []byte)
CreateConfigMap(ctx context.Context, configMap corev1.ConfigMap) error CreateConfigMap(ctx context.Context, configMap corev1.ConfigMap) error
AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string) error AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string, namespace string) error
AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string) error AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string, namespace string) error
} }
type installer interface { type installer interface {
@ -235,13 +235,13 @@ func (k *KubernetesUtil) setupGCPPodNetwork(ctx context.Context, nodeName, nodeP
Effect: "NoSchedule", Effect: "NoSchedule",
}, },
} }
if err = kubectl.AddTolerationsToDeployment(ctx, tolerations, "coredns"); err != nil { if err = kubectl.AddTolerationsToDeployment(ctx, tolerations, "coredns", "kube-system"); err != nil {
return err return err
} }
selectors := map[string]string{ selectors := map[string]string{
"node-role.kubernetes.io/control-plane": "", "node-role.kubernetes.io/control-plane": "",
} }
if err = kubectl.AddNodeSelectorsToDeployment(ctx, selectors, "coredns"); err != nil { if err = kubectl.AddNodeSelectorsToDeployment(ctx, selectors, "coredns", "kube-system"); err != nil {
return err return err
} }

View file

@ -625,11 +625,11 @@ func (s *stubKubectl) CreateConfigMap(ctx context.Context, configMap corev1.Conf
return s.createConfigMapErr return s.createConfigMapErr
} }
func (s *stubKubectl) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string) error { func (s *stubKubectl) AddTolerationsToDeployment(ctx context.Context, tolerations []corev1.Toleration, name string, namespace string) error {
return s.AddTolerationsToDeploymentErr return s.AddTolerationsToDeploymentErr
} }
func (s *stubKubectl) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string) error { func (s *stubKubectl) AddNodeSelectorsToDeployment(ctx context.Context, selectors map[string]string, name string, namespace string) error {
return s.AddTNodeSelectorsToDeploymentErr return s.AddTNodeSelectorsToDeploymentErr
} }