github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/resources_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  
    11  	"github.com/drycc/workflow-cli/pkg/testutil"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestResourcesServices(t *testing.T) {
    16  	t.Parallel()
    17  	cf, server, err := testutil.NewTestServerAndClient()
    18  	if err != nil {
    19  		t.Fatal(err)
    20  	}
    21  	defer server.Close()
    22  	var b bytes.Buffer
    23  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    24  
    25  	server.Mux.HandleFunc("/v2/resources/services/", func(w http.ResponseWriter, _ *http.Request) {
    26  		testutil.SetHeaders(w)
    27  		fmt.Fprintf(w, `{
    28  	"results": [
    29  		{
    30  			"id": "332588e0-6c2c-4f56-a6af-a56fd01ec4b4",
    31  			"name": "mysql",
    32  			"updateable": true
    33  		}
    34  	],
    35  	"count": 1
    36  }`)
    37  	})
    38  
    39  	err = cmdr.ResourcesServices(100)
    40  	assert.NoError(t, err)
    41  
    42  	assert.Equal(t, b.String(), `ID                                      NAME     UPDATEABLE 
    43  332588e0-6c2c-4f56-a6af-a56fd01ec4b4    mysql    true          
    44  `, "output")
    45  }
    46  
    47  func TestResourcesPlans(t *testing.T) {
    48  	t.Parallel()
    49  	cf, server, err := testutil.NewTestServerAndClient()
    50  	if err != nil {
    51  		t.Fatal(err)
    52  	}
    53  	defer server.Close()
    54  	var b bytes.Buffer
    55  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    56  
    57  	server.Mux.HandleFunc("/v2/resources/services/mysql/plans/", func(w http.ResponseWriter, _ *http.Request) {
    58  		testutil.SetHeaders(w)
    59  		fmt.Fprintf(w, `{
    60  	"results": [{
    61  		"id": "4d1dbd33-201b-45bc-9abb-757584ef7ab8",
    62  		"name": "standard-1600",
    63  		"description": "mysql standard-1600 plan which limit persistence size 1600Gi."
    64  	}],
    65  	"count": 1
    66  }`)
    67  	})
    68  
    69  	err = cmdr.ResourcesPlans("mysql", 100)
    70  	assert.NoError(t, err)
    71  
    72  	assert.Equal(t, b.String(), `ID                                      NAME             DESCRIPTION                                                   
    73  4d1dbd33-201b-45bc-9abb-757584ef7ab8    standard-1600    mysql standard-1600 plan which limit persistence size 1600Gi.    
    74  `, "output")
    75  }
    76  
    77  func TestResourcesCreate(t *testing.T) {
    78  	t.Parallel()
    79  	cf, server, err := testutil.NewTestServerAndClient()
    80  	if err != nil {
    81  		t.Fatal(err)
    82  	}
    83  	defer server.Close()
    84  	var b bytes.Buffer
    85  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
    86  
    87  	server.Mux.HandleFunc("/v2/apps/example-go/resources/", func(w http.ResponseWriter, r *http.Request) {
    88  		testutil.AssertBody(t, api.Resource{Name: "mysql", Plan: "mysql:5.6"}, r)
    89  		testutil.SetHeaders(w)
    90  		w.WriteHeader(http.StatusCreated)
    91  		// Body isn't used by CLI, so it isn't set.
    92  		w.Write([]byte("{}"))
    93  	})
    94  
    95  	err = cmdr.ResourcesCreate("example-go", "mysql:5.6", "mysql", nil, "")
    96  	assert.NoError(t, err)
    97  
    98  	assert.Equal(t, testutil.StripProgress(b.String()), "Creating mysql to example-go... done\n", "output")
    99  }
   100  
   101  func TestResourcesList(t *testing.T) {
   102  	t.Parallel()
   103  	cf, server, err := testutil.NewTestServerAndClient()
   104  	if err != nil {
   105  		t.Fatal(err)
   106  	}
   107  	defer server.Close()
   108  	var b bytes.Buffer
   109  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   110  
   111  	server.Mux.HandleFunc("/v2/apps/example-go/resources/", func(w http.ResponseWriter, _ *http.Request) {
   112  		testutil.SetHeaders(w)
   113  		fmt.Fprintf(w, `{
   114     "count": 1,
   115     "next": null,
   116     "previous": null,
   117     "results": [
   118  		{
   119  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   120  			"owner": "test",
   121  			"app": "example-go",
   122  			"name": "mysql",
   123  			"plan": "mysql:5.6",
   124  			"data": {},
   125  			"options": {},
   126  			"status": null,
   127  			"binding": null,
   128  			"created": "2020-09-08T00:00:00UTC",
   129  			"updated": "2020-09-08T00:00:00UTC"
   130  		}
   131     ]
   132  }`)
   133  	})
   134  
   135  	err = cmdr.ResourcesList("example-go", -1)
   136  	assert.NoError(t, err)
   137  
   138  	assert.Equal(t, b.String(), `UUID                                    NAME     OWNER    PLAN         UPDATED                
   139  de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    mysql    test     mysql:5.6    2020-09-08T00:00:00UTC    
   140  `, "output")
   141  }
   142  
   143  func TestResourceGet(t *testing.T) {
   144  	t.Parallel()
   145  	cf, server, err := testutil.NewTestServerAndClient()
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  	defer server.Close()
   150  	var b bytes.Buffer
   151  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   152  
   153  	server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/", func(w http.ResponseWriter, _ *http.Request) {
   154  		testutil.SetHeaders(w)
   155  		fmt.Fprintf(w, `{
   156  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   157  			"owner": "test",
   158  			"app": "example-go",
   159  			"name": "mysql",
   160  			"plan": "mysql:5.6",
   161  			"data": {"data12":"value1","data3":"value1"},
   162  			"options": {"para13451":"value2","para122":"value1"},
   163  			"status": "Ready",
   164  			"binding": "Ready",
   165  			"created": "2020-09-08T00:00:00UTC",
   166  			"updated": "2020-09-08T00:00:00UTC"
   167  }`)
   168  	})
   169  
   170  	err = cmdr.ResourceGet("example-go", "mysql")
   171  	assert.NoError(t, err)
   172  	// todo format data json to yaml
   173  	assert.Equal(t, b.String(), `App:        example-go                              
   174  UUID:       de1bf5b5-4a72-4f94-a10c-d2a3741cdf75    
   175  Name:       mysql                                   
   176  Plan:       mysql:5.6                               
   177  Owner:      test                                    
   178  Status:     Ready                                   
   179  Binding:    Ready                                   
   180  Data:       
   181              data12:                                 value1    
   182              data3:                                  value1    
   183  Options:    
   184              para122:                                value1    
   185              para13451:                              value2    
   186  Message:    <none>                                  
   187  Created:    2020-09-08T00:00:00UTC                  
   188  Updated:    2020-09-08T00:00:00UTC                  
   189  `, "output")
   190  }
   191  
   192  func TestResourceDelete(t *testing.T) {
   193  	t.Parallel()
   194  	cf, server, err := testutil.NewTestServerAndClient()
   195  	if err != nil {
   196  		t.Fatal(err)
   197  	}
   198  	defer server.Close()
   199  	var b bytes.Buffer
   200  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   201  
   202  	server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/", func(w http.ResponseWriter, _ *http.Request) {
   203  		testutil.SetHeaders(w)
   204  		w.WriteHeader(http.StatusNoContent)
   205  	})
   206  
   207  	err = cmdr.ResourceDelete("example-go", "mysql", "mysql")
   208  	assert.NoError(t, err)
   209  
   210  	assert.Equal(t, testutil.StripProgress(b.String()), "Deleting mysql from example-go... done\n", "output")
   211  }
   212  
   213  func TestResourcePut(t *testing.T) {
   214  	t.Parallel()
   215  	cf, server, err := testutil.NewTestServerAndClient()
   216  	if err != nil {
   217  		t.Fatal(err)
   218  	}
   219  	defer server.Close()
   220  	var b bytes.Buffer
   221  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   222  
   223  	server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/", func(w http.ResponseWriter, r *http.Request) {
   224  		paras := make(map[string]interface{}, 1)
   225  		paras["para1.para2"] = "v1"
   226  		testutil.AssertBody(t, api.Resource{Plan: "mysql:5.7", Options: paras}, r)
   227  		testutil.SetHeaders(w)
   228  		w.WriteHeader(http.StatusCreated)
   229  		// Body isn't used by CLI, so it isn't set.
   230  		w.Write([]byte("{}"))
   231  	})
   232  
   233  	err = cmdr.ResourcePut("example-go", "mysql:5.7", "mysql", []string{"para1.para2=v1"}, "")
   234  	assert.NoError(t, err)
   235  
   236  	assert.Equal(t, testutil.StripProgress(b.String()), "Updating mysql to example-go... done\n", "output")
   237  }
   238  
   239  func TestResourceBind(t *testing.T) {
   240  	t.Parallel()
   241  	cf, server, err := testutil.NewTestServerAndClient()
   242  	if err != nil {
   243  		t.Fatal(err)
   244  	}
   245  	defer server.Close()
   246  
   247  	server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/binding/", func(w http.ResponseWriter, r *http.Request) {
   248  		testutil.SetHeaders(w)
   249  		if r.Method == "PATCH" {
   250  			testutil.AssertBody(t, api.ResourceBinding{
   251  				BindAction: "bind",
   252  			}, r)
   253  		}
   254  		fmt.Fprintf(w, `{
   255  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   256  			"owner": "test",
   257  			"app": "example-go",
   258  			"name": "mysql",
   259  			"plan": "mysql:5.7",
   260  			"data": {},
   261  			"options": {},
   262  			"status": null,
   263  			"binding": null,
   264  			"created": "2020-09-08T00:00:00UTC",
   265  			"updated": "2020-09-08T00:00:00UTC"
   266  }`)
   267  	})
   268  
   269  	var b bytes.Buffer
   270  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   271  
   272  	err = cmdr.ResourceBind("example-go", "mysql")
   273  	assert.NoError(t, err)
   274  
   275  	assert.Equal(t, testutil.StripProgress(b.String()), `Binding resource... done
   276  `, "output")
   277  }
   278  
   279  func TestResourceUnbind(t *testing.T) {
   280  	t.Parallel()
   281  	cf, server, err := testutil.NewTestServerAndClient()
   282  	if err != nil {
   283  		t.Fatal(err)
   284  	}
   285  	defer server.Close()
   286  
   287  	server.Mux.HandleFunc("/v2/apps/example-go/resources/mysql/binding/", func(w http.ResponseWriter, r *http.Request) {
   288  		testutil.SetHeaders(w)
   289  		if r.Method == "PATCH" {
   290  			testutil.AssertBody(t, api.ResourceBinding{
   291  				BindAction: "unbind",
   292  			}, r)
   293  		}
   294  		fmt.Fprintf(w, `{
   295  			"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
   296  			"owner": "test",
   297  			"app": "example-go",
   298  			"name": "mysql",
   299  			"plan": "mysql:5.7",
   300  			"data": {},
   301  			"options": {},
   302  			"status": null,
   303  			"binding": null,
   304  			"created": "2020-09-08T00:00:00UTC",
   305  			"updated": "2020-09-08T00:00:00UTC"
   306  }`)
   307  	})
   308  
   309  	var b bytes.Buffer
   310  	cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
   311  
   312  	err = cmdr.ResourceUnbind("example-go", "mysql")
   313  	assert.NoError(t, err)
   314  
   315  	assert.Equal(t, testutil.StripProgress(b.String()), `Unbinding resource... done
   316  `, "output")
   317  }