github.com/pluralsh/plural-cli@v0.9.5/cmd/plural/vpn_test.go (about)

     1  package plural_test
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"github.com/pluralsh/plural-cli/cmd/plural"
     8  	"github.com/pluralsh/plural-cli/pkg/api"
     9  	"github.com/pluralsh/plural-cli/pkg/test/mocks"
    10  	vpnv1alpha1 "github.com/pluralsh/plural-operator/apis/vpn/v1alpha1"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/mock"
    13  	corev1 "k8s.io/api/core/v1"
    14  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    15  )
    16  
    17  func TestServerList(t *testing.T) {
    18  	tests := []struct {
    19  		name             string
    20  		args             []string
    21  		servers          *vpnv1alpha1.WireguardServerList
    22  		expectedResponse string
    23  		installation     *api.Installation
    24  	}{
    25  		{
    26  			name: `test "vpn list servers"`,
    27  			args: []string{plural.ApplicationName, "vpn", "list", "servers"},
    28  			servers: &vpnv1alpha1.WireguardServerList{
    29  				Items: []vpnv1alpha1.WireguardServer{
    30  					{
    31  						ObjectMeta: metav1.ObjectMeta{
    32  							Name:      "wireguard",
    33  							Namespace: "wireguard",
    34  						},
    35  						Spec: vpnv1alpha1.WireguardServerSpec{
    36  							WireguardImage: "dkr.plural.sh/bootstrap/wireguard-server:0.1.2",
    37  						},
    38  						Status: vpnv1alpha1.WireguardServerStatus{
    39  							Port:     "51820",
    40  							Hostname: "k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com",
    41  							Ready:    true,
    42  						},
    43  					},
    44  				},
    45  			},
    46  			installation: &api.Installation{
    47  				Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}},
    48  			},
    49  			expectedResponse: `+-----------+-------------------------------------------------------------------------------+-------+-------+
    50  |   NAME    |                                   HOSTNAME                                    | PORT  | READY |
    51  +-----------+-------------------------------------------------------------------------------+-------+-------+
    52  | wireguard | k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com | 51820 | true  |
    53  +-----------+-------------------------------------------------------------------------------+-------+-------+
    54  `,
    55  		},
    56  	}
    57  	for _, test := range tests {
    58  		t.Run(test.name, func(t *testing.T) {
    59  			client := mocks.NewClient(t)
    60  			kube := mocks.NewKube(t)
    61  			client.On("GetInstallation", "wireguard").Return(test.installation, nil)
    62  			kube.On("WireguardServerList", "wireguard").Return(test.servers, nil)
    63  			app := plural.CreateNewApp(&plural.Plural{Client: client, Kube: kube})
    64  			app.HelpName = plural.ApplicationName
    65  			os.Args = test.args
    66  			res, err := captureStdout(app, os.Args)
    67  			assert.NoError(t, err)
    68  			assert.Equal(t, test.expectedResponse, res)
    69  
    70  		})
    71  	}
    72  }
    73  
    74  func TestClientList(t *testing.T) {
    75  	tests := []struct {
    76  		name             string
    77  		args             []string
    78  		peers            *vpnv1alpha1.WireguardPeerList
    79  		expectedResponse string
    80  		installation     *api.Installation
    81  	}{
    82  		{
    83  			name: `test "vpn list clients" without server flag`,
    84  			args: []string{plural.ApplicationName, "vpn", "list", "clients"},
    85  			peers: &vpnv1alpha1.WireguardPeerList{
    86  				Items: []vpnv1alpha1.WireguardPeer{
    87  					{
    88  						ObjectMeta: metav1.ObjectMeta{
    89  							Name:      "test-client-1",
    90  							Namespace: "wireguard",
    91  						},
    92  						Spec: vpnv1alpha1.WireguardPeerSpec{
    93  							WireguardRef: "wireguard",
    94  							Address:      "10.8.0.2",
    95  							PublicKey:    "test-public-key",
    96  						},
    97  						Status: vpnv1alpha1.WireguardPeerStatus{
    98  							ConfigRef: corev1.SecretKeySelector{
    99  								LocalObjectReference: corev1.LocalObjectReference{
   100  									Name: "test-client-1-config",
   101  								},
   102  								Key: "wg0.conf",
   103  							},
   104  							Ready: true,
   105  						},
   106  					},
   107  					{
   108  						ObjectMeta: metav1.ObjectMeta{
   109  							Name:      "test-client-2",
   110  							Namespace: "wireguard",
   111  						},
   112  						Spec: vpnv1alpha1.WireguardPeerSpec{
   113  							WireguardRef: "wireguard2",
   114  							Address:      "10.8.0.3",
   115  							PublicKey:    "test-public-key",
   116  						},
   117  						Status: vpnv1alpha1.WireguardPeerStatus{
   118  							ConfigRef: corev1.SecretKeySelector{
   119  								LocalObjectReference: corev1.LocalObjectReference{
   120  									Name: "test-client-2-config",
   121  								},
   122  								Key: "wg0.conf",
   123  							},
   124  							Ready: false,
   125  						},
   126  					},
   127  				},
   128  			},
   129  			installation: &api.Installation{
   130  				Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}},
   131  			},
   132  			expectedResponse: `+---------------+----------+----------------------+-----------------+-------+
   133  |     NAME      | ADDRESS  |    CONFIG SECRET     |   PUBLIC KEY    | READY |
   134  +---------------+----------+----------------------+-----------------+-------+
   135  | test-client-1 | 10.8.0.2 | test-client-1-config | test-public-key | true  |
   136  +---------------+----------+----------------------+-----------------+-------+
   137  `,
   138  		},
   139  		{
   140  			name: `test "vpn list clients" with server flag`,
   141  			args: []string{plural.ApplicationName, "vpn", "list", "clients", "--server", "wireguard2"},
   142  			peers: &vpnv1alpha1.WireguardPeerList{
   143  				Items: []vpnv1alpha1.WireguardPeer{
   144  					{
   145  						ObjectMeta: metav1.ObjectMeta{
   146  							Name:      "test-client-1",
   147  							Namespace: "wireguard",
   148  						},
   149  						Spec: vpnv1alpha1.WireguardPeerSpec{
   150  							WireguardRef: "wireguard",
   151  							Address:      "10.8.0.2",
   152  							PublicKey:    "test-public-key",
   153  						},
   154  						Status: vpnv1alpha1.WireguardPeerStatus{
   155  							ConfigRef: corev1.SecretKeySelector{
   156  								LocalObjectReference: corev1.LocalObjectReference{
   157  									Name: "test-client-1-config",
   158  								},
   159  								Key: "wg0.conf",
   160  							},
   161  							Ready: true,
   162  						},
   163  					},
   164  					{
   165  						ObjectMeta: metav1.ObjectMeta{
   166  							Name:      "test-client-2",
   167  							Namespace: "wireguard",
   168  						},
   169  						Spec: vpnv1alpha1.WireguardPeerSpec{
   170  							WireguardRef: "wireguard2",
   171  							Address:      "10.8.0.3",
   172  							PublicKey:    "test-public-key",
   173  						},
   174  						Status: vpnv1alpha1.WireguardPeerStatus{
   175  							ConfigRef: corev1.SecretKeySelector{
   176  								LocalObjectReference: corev1.LocalObjectReference{
   177  									Name: "test-client-2-config",
   178  								},
   179  								Key: "wg0.conf",
   180  							},
   181  							Ready: false,
   182  						},
   183  					},
   184  				},
   185  			},
   186  			installation: &api.Installation{
   187  				Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}},
   188  			},
   189  			expectedResponse: `+---------------+----------+----------------------+-----------------+-------+
   190  |     NAME      | ADDRESS  |    CONFIG SECRET     |   PUBLIC KEY    | READY |
   191  +---------------+----------+----------------------+-----------------+-------+
   192  | test-client-2 | 10.8.0.3 | test-client-2-config | test-public-key | false |
   193  +---------------+----------+----------------------+-----------------+-------+
   194  `,
   195  		},
   196  	}
   197  	for _, test := range tests {
   198  		t.Run(test.name, func(t *testing.T) {
   199  			client := mocks.NewClient(t)
   200  			kube := mocks.NewKube(t)
   201  			client.On("GetInstallation", "wireguard").Return(test.installation, nil)
   202  			kube.On("WireguardPeerList", "wireguard").Return(test.peers, nil)
   203  			app := plural.CreateNewApp(&plural.Plural{Client: client, Kube: kube})
   204  			app.HelpName = plural.ApplicationName
   205  			os.Args = test.args
   206  			res, err := captureStdout(app, os.Args)
   207  			assert.NoError(t, err)
   208  			assert.Equal(t, test.expectedResponse, res)
   209  
   210  		})
   211  	}
   212  }
   213  
   214  func TestClientCreate(t *testing.T) {
   215  	tests := []struct {
   216  		name             string
   217  		args             []string
   218  		peer             *vpnv1alpha1.WireguardPeer
   219  		expectedResponse string
   220  		installation     *api.Installation
   221  		server           *vpnv1alpha1.WireguardServer
   222  		expectedError    string
   223  	}{
   224  		{
   225  			name: `test "vpn create client" without specifying server`,
   226  			args: []string{plural.ApplicationName, "vpn", "create", "client", "test-client"},
   227  			peer: &vpnv1alpha1.WireguardPeer{
   228  
   229  				ObjectMeta: metav1.ObjectMeta{
   230  					Name:      "test-client",
   231  					Namespace: "wireguard",
   232  				},
   233  				Spec: vpnv1alpha1.WireguardPeerSpec{
   234  					WireguardRef: "wireguard",
   235  					Address:      "10.8.0.2",
   236  					PublicKey:    "test-public-key",
   237  				},
   238  				Status: vpnv1alpha1.WireguardPeerStatus{
   239  					ConfigRef: corev1.SecretKeySelector{
   240  						LocalObjectReference: corev1.LocalObjectReference{
   241  							Name: "test-client-config",
   242  						},
   243  						Key: "wg0.conf",
   244  					},
   245  					Ready: true,
   246  				},
   247  			},
   248  			installation: &api.Installation{
   249  				Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}},
   250  			},
   251  			server: &vpnv1alpha1.WireguardServer{
   252  				ObjectMeta: metav1.ObjectMeta{
   253  					Name:      "wireguard",
   254  					Namespace: "wireguard",
   255  				},
   256  				Spec: vpnv1alpha1.WireguardServerSpec{
   257  					WireguardImage: "dkr.plural.sh/bootstrap/wireguard-server:0.1.2",
   258  				},
   259  				Status: vpnv1alpha1.WireguardServerStatus{
   260  					Port:     "51820",
   261  					Hostname: "k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com",
   262  					Ready:    true,
   263  				},
   264  			},
   265  			expectedResponse: `+-------------+----------+-----------+--------------------+-----------------+-------+
   266  |    NAME     | ADDRESS  |  SERVER   |   CONFIG SECRET    |   PUBLIC KEY    | READY |
   267  +-------------+----------+-----------+--------------------+-----------------+-------+
   268  | test-client | 10.8.0.2 | wireguard | test-client-config | test-public-key | true  |
   269  +-------------+----------+-----------+--------------------+-----------------+-------+
   270  `,
   271  		},
   272  		{
   273  			name: `test "vpn create client" with specifying server flag`,
   274  			args: []string{plural.ApplicationName, "vpn", "create", "client", "test-client", "--server", "wireguard2"},
   275  			peer: &vpnv1alpha1.WireguardPeer{
   276  
   277  				ObjectMeta: metav1.ObjectMeta{
   278  					Name:      "test-client",
   279  					Namespace: "wireguard",
   280  				},
   281  				Spec: vpnv1alpha1.WireguardPeerSpec{
   282  					WireguardRef: "wireguard2",
   283  					Address:      "10.8.0.2",
   284  					PublicKey:    "test-public-key",
   285  				},
   286  				Status: vpnv1alpha1.WireguardPeerStatus{
   287  					ConfigRef: corev1.SecretKeySelector{
   288  						LocalObjectReference: corev1.LocalObjectReference{
   289  							Name: "test-client-config",
   290  						},
   291  						Key: "wg0.conf",
   292  					},
   293  					Ready: true,
   294  				},
   295  			},
   296  			installation: &api.Installation{
   297  				Id: "123", Repository: &api.Repository{Id: "abc", Name: "wireguard", Publisher: &api.Publisher{Name: "Plural"}},
   298  			},
   299  			server: &vpnv1alpha1.WireguardServer{
   300  				ObjectMeta: metav1.ObjectMeta{
   301  					Name:      "wireguard2",
   302  					Namespace: "wireguard",
   303  				},
   304  				Spec: vpnv1alpha1.WireguardServerSpec{
   305  					WireguardImage: "dkr.plural.sh/bootstrap/wireguard-server:0.1.2",
   306  				},
   307  				Status: vpnv1alpha1.WireguardServerStatus{
   308  					Port:     "51820",
   309  					Hostname: "k8s-wireguar-wireguar-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.us-east-1.amazonaws.com",
   310  					Ready:    true,
   311  				},
   312  			},
   313  			expectedResponse: `+-------------+----------+------------+--------------------+-----------------+-------+
   314  |    NAME     | ADDRESS  |   SERVER   |   CONFIG SECRET    |   PUBLIC KEY    | READY |
   315  +-------------+----------+------------+--------------------+-----------------+-------+
   316  | test-client | 10.8.0.2 | wireguard2 | test-client-config | test-public-key | true  |
   317  +-------------+----------+------------+--------------------+-----------------+-------+
   318  `,
   319  		},
   320  	}
   321  	for _, test := range tests {
   322  		t.Run(test.name, func(t *testing.T) {
   323  			client := mocks.NewClient(t)
   324  			kube := mocks.NewKube(t)
   325  			client.On("GetInstallation", "wireguard").Return(test.installation, nil)
   326  			if test.expectedError == "" {
   327  				kube.On("WireguardServer", "wireguard", mock.AnythingOfType("string")).Return(test.server, nil)
   328  				kube.On("WireguardPeerCreate", "wireguard", mock.AnythingOfType("*v1alpha1.WireguardPeer")).Return(test.peer, nil)
   329  			}
   330  			app := plural.CreateNewApp(&plural.Plural{Client: client, Kube: kube})
   331  			app.HelpName = plural.ApplicationName
   332  			os.Args = test.args
   333  			res, err := captureStdout(app, os.Args)
   334  			if test.expectedError != "" {
   335  				assert.Equal(t, err.Error(), test.expectedError)
   336  			} else {
   337  				assert.NoError(t, err)
   338  				assert.Equal(t, test.expectedResponse, res)
   339  			}
   340  		})
   341  	}
   342  }