github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/volumes_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	"testing"
     8  
     9  	"github.com/drycc/controller-sdk-go/api"
    10  	"github.com/drycc/workflow-cli/pkg/testutil"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  func TestVolumesList(t *testing.T) {
    15  	t.Parallel()
    16  	cf, server, err := testutil.NewTestServerAndClient()
    17  	if err != nil {
    18  		t.Fatal(err)
    19  	}
    20  	defer server.Close()
    21  	var b bytes.Buffer
    22  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    23  
    24  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/", func(w http.ResponseWriter, _ *http.Request) {
    25  		testutil.SetHeaders(w)
    26  		fmt.Fprintf(w, `{
    27      "count": 1,
    28      "next": null,
    29      "previous": null,
    30      "results": [
    31  		{
    32  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
    33  			"owner": "test",
    34  			"app": "example-go",
    35  			"name": "myvolume",
    36  			"size": "500G",
    37  			"path": {"cmd": "/data/cmd1", "cmd123": "/data/cmd123"},
    38  			"type": "csi",
    39  			"parameters": {},
    40  			"created": "2020-08-26T00:00:00UTC",
    41  			"updated": "2020-08-26T00:00:00UTC"
    42  		}
    43      ]
    44  }`)
    45  	})
    46  
    47  	err = cmdr.VolumesList("example-go", -1)
    48  	assert.NoError(t, err)
    49  	assert.Equal(t, b.String(), `NAME        OWNER    TYPE    PTYPE     PATH            SIZE 
    50  myvolume    test     csi     cmd       /data/cmd1      500G    
    51  myvolume    test     csi     cmd123    /data/cmd123    500G    
    52  `, "output")
    53  }
    54  
    55  func TestVolumesCreate(t *testing.T) {
    56  	t.Parallel()
    57  	cf, server, err := testutil.NewTestServerAndClient()
    58  	if err != nil {
    59  		t.Fatal(err)
    60  	}
    61  	defer server.Close()
    62  	var b bytes.Buffer
    63  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    64  
    65  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/", func(w http.ResponseWriter, r *http.Request) {
    66  		testutil.AssertBody(t, api.Volume{Name: "myvolume", Size: "500G", Type: "csi"}, r)
    67  		testutil.SetHeaders(w)
    68  		w.WriteHeader(http.StatusCreated)
    69  		// Body isn't used by CLI, so it isn't set.
    70  		w.Write([]byte("{}"))
    71  	})
    72  
    73  	err = cmdr.VolumesCreate("example-go", "myvolume", "csi", "500G", map[string]interface{}{})
    74  	assert.NoError(t, err)
    75  	err = cmdr.VolumesCreate("example-go", "myvolume", "csi", "500K", map[string]interface{}{})
    76  	expected := `500K doesn't fit format #unit
    77  Examples: 2G 2g`
    78  	assert.Equal(t, err.Error(), expected, "output")
    79  
    80  	assert.Equal(t, testutil.StripProgress(b.String()), "Creating myvolume to example-go... done\n", "output")
    81  }
    82  
    83  func TestVolumesInfo(t *testing.T) {
    84  	t.Parallel()
    85  	cf, server, err := testutil.NewTestServerAndClient()
    86  	if err != nil {
    87  		t.Fatal(err)
    88  	}
    89  	defer server.Close()
    90  	var b bytes.Buffer
    91  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    92  
    93  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/", func(w http.ResponseWriter, _ *http.Request) {
    94  		testutil.SetHeaders(w)
    95  		fmt.Fprintf(w, `{
    96  	"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
    97  	"owner": "test",
    98  	"app": "example-go",
    99  	"name": "myvolume",
   100  	"size": "0G",
   101  	"path": {"cmd": "/data/cmd1", "cmd123": "/data/cmd123"},
   102  	"type": "nfs",
   103  	"parameters": {
   104  		"nfs": {
   105  			"server": "nfs.drycc.cc",
   106  			"path": "/mnt",
   107  			"readOnly": true
   108  		}
   109  	},
   110  	"created": "2020-08-26T00:00:00UTC",
   111  	"updated": "2020-08-26T00:00:00UTC"
   112  }`)
   113  	})
   114  
   115  	err = cmdr.VolumesInfo("example-go", "myvolume")
   116  	assert.NoError(t, err)
   117  	assert.Equal(t, b.String(), `UUID:          de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    
   118  Name:          myvolume                                
   119  Owner:         test                                    
   120  Type:          nfs                                     
   121  Path:          
   122                 cmd: /data/cmd1                         
   123                 cmd123: /data/cmd123                    
   124                                                         
   125  Parameters:    
   126                 nfs:                                    
   127                   path: /mnt                            
   128                   readOnly: true                        
   129                   server: nfs.drycc.cc                  
   130                                                         
   131  Created:       2020-08-26T00:00:00UTC                  
   132  Updated:       2020-08-26T00:00:00UTC                  
   133  `, "output")
   134  }
   135  
   136  func TestVolumesExpand(t *testing.T) {
   137  	t.Parallel()
   138  	cf, server, err := testutil.NewTestServerAndClient()
   139  	if err != nil {
   140  		t.Fatal(err)
   141  	}
   142  	defer server.Close()
   143  	var b bytes.Buffer
   144  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   145  
   146  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/", func(w http.ResponseWriter, r *http.Request) {
   147  		testutil.AssertBody(t, api.Volume{Name: "myvolume", Size: "500G"}, r)
   148  		testutil.SetHeaders(w)
   149  		w.WriteHeader(http.StatusCreated)
   150  		// Body isn't used by CLI, so it isn't set.
   151  		w.Write([]byte("{}"))
   152  	})
   153  
   154  	err = cmdr.VolumesExpand("example-go", "myvolume", "500G")
   155  	assert.NoError(t, err)
   156  	err = cmdr.VolumesExpand("example-go", "myvolume", "500K")
   157  	expected := `500K doesn't fit format #unit
   158  Examples: 2G 2g`
   159  	assert.Equal(t, err.Error(), expected, "output")
   160  
   161  	assert.Equal(t, testutil.StripProgress(b.String()), "Expand myvolume to example-go... done\n", "output")
   162  }
   163  
   164  func TestVolumesDelete(t *testing.T) {
   165  	t.Parallel()
   166  	cf, server, err := testutil.NewTestServerAndClient()
   167  	if err != nil {
   168  		t.Fatal(err)
   169  	}
   170  	defer server.Close()
   171  	var b bytes.Buffer
   172  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   173  
   174  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/", func(w http.ResponseWriter, _ *http.Request) {
   175  		testutil.SetHeaders(w)
   176  		w.WriteHeader(http.StatusNoContent)
   177  	})
   178  
   179  	err = cmdr.VolumesDelete("example-go", "myvolume")
   180  	assert.NoError(t, err)
   181  
   182  	assert.Equal(t, testutil.StripProgress(b.String()), "Deleting myvolume from example-go... done\n", "output")
   183  }
   184  
   185  func TestVolumesMount(t *testing.T) {
   186  	t.Parallel()
   187  	cf, server, err := testutil.NewTestServerAndClient()
   188  	if err != nil {
   189  		t.Fatal(err)
   190  	}
   191  	defer server.Close()
   192  
   193  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/path/", func(w http.ResponseWriter, r *http.Request) {
   194  		testutil.SetHeaders(w)
   195  		if r.Method == "PATCH" {
   196  			testutil.AssertBody(t, api.Volume{
   197  				Path: map[string]interface{}{
   198  					"cmd": "/data/cmd1",
   199  				},
   200  			}, r)
   201  		}
   202  		fmt.Fprintf(w, `{
   203  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   204  			"owner": "test",
   205  			"app": "example-go",
   206  			"name": "myvolume",
   207  			"size": "500G",
   208  			"path": {"cmd": "/data/cmd1"},
   209  			"type": "csi",
   210  			"parameters": {},
   211  			"created": "2020-08-26T00:00:00UTC",
   212  			"updated": "2020-08-26T00:00:00UTC"
   213  }`)
   214  	})
   215  
   216  	var b bytes.Buffer
   217  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   218  
   219  	err = cmdr.VolumesMount("example-go", "myvolume", []string{"cmd=/data/cmd1"})
   220  	assert.NoError(t, err)
   221  
   222  	assert.Equal(t, testutil.StripProgress(b.String()), `Mounting volume... done
   223  The pods should be restart, please check the pods up or not.
   224  `, "output")
   225  }
   226  
   227  func TestVolumesUnmount(t *testing.T) {
   228  	t.Parallel()
   229  	cf, server, err := testutil.NewTestServerAndClient()
   230  	if err != nil {
   231  		t.Fatal(err)
   232  	}
   233  	defer server.Close()
   234  
   235  	server.Mux.HandleFunc("/v2/apps/example-go/volumes/myvolume/path/", func(w http.ResponseWriter, r *http.Request) {
   236  		testutil.SetHeaders(w)
   237  		if r.Method == "PATCH" {
   238  			testutil.AssertBody(t, api.Volume{
   239  				Path: map[string]interface{}{
   240  					"cmd": nil,
   241  				},
   242  			}, r)
   243  		}
   244  		fmt.Fprintf(w, `{
   245  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   246  			"owner": "test",
   247  			"app": "example-go",
   248  			"name": "myvolume",
   249  			"size": "500G",
   250  			"path": {},
   251  			"type": "csi",
   252  			"parameters": {},
   253  			"created": "2020-08-26T00:00:00UTC",
   254  			"updated": "2020-08-26T00:00:00UTC"
   255  }`)
   256  	})
   257  
   258  	var b bytes.Buffer
   259  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   260  
   261  	err = cmdr.VolumesUnmount("example-go", "myvolume", []string{"cmd"})
   262  	assert.NoError(t, err)
   263  
   264  	assert.Equal(t, testutil.StripProgress(b.String()), `Unmounting volume... done
   265  The pods should be restart, please check the pods up or not.
   266  `, "output")
   267  }