github.com/fnproject/cli@v0.0.0-20240508150455-e5d88bd86117/objects/fn/commands.go (about)

     1  /*
     2   * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package fn
    18  
    19  import (
    20  	"encoding/json"
    21  	"fmt"
    22  
    23  	client "github.com/fnproject/cli/client"
    24  	"github.com/fnproject/cli/objects/app"
    25  	"github.com/urfave/cli"
    26  )
    27  
    28  // Create function command
    29  func Create() cli.Command {
    30  	f := fnsCmd{}
    31  	return cli.Command{
    32  		Name:        "function",
    33  		ShortName:   "func",
    34  		Aliases:     []string{"f", "fn"},
    35  		Category:    "MANAGEMENT COMMAND",
    36  		Usage:       "Create a function within an application",
    37  		Description: "This command creates a new function within an application.",
    38  		Before: func(c *cli.Context) error {
    39  			var err error
    40  			f.provider, err = client.CurrentProvider()
    41  			if err != nil {
    42  				return err
    43  			}
    44  			f.client = f.provider.APIClientv2()
    45  			return nil
    46  		},
    47  		ArgsUsage: "<app-name> <function-name> <image>",
    48  		Action:    f.create,
    49  		Flags:     FnFlags,
    50  		BashComplete: func(c *cli.Context) {
    51  			if len(c.Args()) == 0 {
    52  				app.BashCompleteApps(c)
    53  			}
    54  		},
    55  	}
    56  }
    57  
    58  // List functions command
    59  func List() cli.Command {
    60  	f := fnsCmd{}
    61  	return cli.Command{
    62  		Name:        "functions",
    63  		ShortName:   "funcs",
    64  		Aliases:     []string{"f", "fn"},
    65  		Usage:       "List functions for an application",
    66  		Category:    "MANAGEMENT COMMAND",
    67  		Description: "This command returns a list of functions for a created application.",
    68  		Before: func(c *cli.Context) error {
    69  			var err error
    70  			f.provider, err = client.CurrentProvider()
    71  			if err != nil {
    72  				return err
    73  			}
    74  			f.client = f.provider.APIClientv2()
    75  			return nil
    76  		},
    77  		ArgsUsage: "<app-name>",
    78  		Action:    f.list,
    79  		Flags: []cli.Flag{
    80  			cli.StringFlag{
    81  				Name:  "cursor",
    82  				Usage: "pagination cursor",
    83  			},
    84  			cli.Int64Flag{
    85  				Name:  "n",
    86  				Usage: "number of functions to return",
    87  				Value: int64(100),
    88  			},
    89  			cli.StringFlag{
    90  				Name:  "output",
    91  				Usage: "Output format (json)",
    92  				Value: "",
    93  			},
    94  		},
    95  		BashComplete: func(c *cli.Context) {
    96  			switch len(c.Args()) {
    97  			case 0:
    98  				app.BashCompleteApps(c)
    99  			}
   100  		},
   101  	}
   102  }
   103  
   104  // Delete function command
   105  func Delete() cli.Command {
   106  	f := fnsCmd{}
   107  	return cli.Command{
   108  		Name:        "function",
   109  		ShortName:   "func",
   110  		Aliases:     []string{"f", "fn"},
   111  		Category:    "MANAGEMENT COMMAND",
   112  		Description: "This command deletes an existing function from an application.",
   113  		Usage:       "Delete a function from an application",
   114  		Before: func(c *cli.Context) error {
   115  			var err error
   116  			f.provider, err = client.CurrentProvider()
   117  			if err != nil {
   118  				return err
   119  			}
   120  			f.client = f.provider.APIClientv2()
   121  			return nil
   122  		},
   123  		ArgsUsage: "<app-name> <function-name>",
   124  		Action:    f.delete,
   125  		BashComplete: func(c *cli.Context) {
   126  			switch len(c.Args()) {
   127  			case 0:
   128  				app.BashCompleteApps(c)
   129  			case 1:
   130  				BashCompleteFns(c)
   131  			}
   132  		},
   133  		Flags: []cli.Flag{
   134  			cli.BoolFlag{
   135  				Name:  "force, f",
   136  				Usage: "Forces this delete (you will not be asked if you wish to continue with the delete)",
   137  			},
   138  			cli.BoolFlag{
   139  				Name:  "recursive, r",
   140  				Usage: "Delete this function and all associated resources (can fail part way through execution after deleting some resources without the ability to undo)",
   141  			},
   142  		},
   143  	}
   144  }
   145  
   146  // Inspect function command
   147  func Inspect() cli.Command {
   148  	f := fnsCmd{}
   149  	return cli.Command{
   150  		Name:        "function",
   151  		ShortName:   "func",
   152  		Aliases:     []string{"f", "fn"},
   153  		Category:    "MANAGEMENT COMMAND",
   154  		Usage:       "Retrieve one or all properties for a function",
   155  		Description: "This command inspects properties of a function.",
   156  		Before: func(c *cli.Context) error {
   157  			var err error
   158  			f.provider, err = client.CurrentProvider()
   159  			if err != nil {
   160  				return err
   161  			}
   162  			f.client = f.provider.APIClientv2()
   163  			return nil
   164  		},
   165  		Flags: []cli.Flag{
   166  			cli.BoolFlag{
   167  				Name:  "endpoint",
   168  				Usage: "Output the function invoke endpoint if set",
   169  			},
   170  		},
   171  		ArgsUsage: "<app-name> <function-name> [property[.key]]",
   172  		Action:    f.inspect,
   173  		BashComplete: func(c *cli.Context) {
   174  			switch len(c.Args()) {
   175  			case 0:
   176  				app.BashCompleteApps(c)
   177  			case 1:
   178  				BashCompleteFns(c)
   179  			case 2:
   180  				fn, err := getFnByAppAndFnName(c.Args()[0], c.Args()[1])
   181  				if err != nil {
   182  					return
   183  				}
   184  				data, err := json.Marshal(fn)
   185  				if err != nil {
   186  					return
   187  				}
   188  				var inspect map[string]interface{}
   189  				err = json.Unmarshal(data, &inspect)
   190  				if err != nil {
   191  					return
   192  				}
   193  				for key := range inspect {
   194  					fmt.Println(key)
   195  				}
   196  			}
   197  		},
   198  	}
   199  }
   200  
   201  // Update function command
   202  func Update() cli.Command {
   203  	f := fnsCmd{}
   204  	return cli.Command{
   205  		Name:        "function",
   206  		ShortName:   "func",
   207  		Aliases:     []string{"f", "fn"},
   208  		Category:    "MANAGEMENT COMMAND",
   209  		Usage:       "Update a function in application",
   210  		Description: "This command updates a function in an application.",
   211  		Before: func(c *cli.Context) error {
   212  			var err error
   213  			f.provider, err = client.CurrentProvider()
   214  			if err != nil {
   215  				return err
   216  			}
   217  			f.client = f.provider.APIClientv2()
   218  			return nil
   219  		},
   220  		ArgsUsage: "<app-name> <function-name>",
   221  		Action:    f.update,
   222  		Flags:     updateFnFlags,
   223  		BashComplete: func(c *cli.Context) {
   224  			switch len(c.Args()) {
   225  			case 0:
   226  				app.BashCompleteApps(c)
   227  			case 1:
   228  				BashCompleteFns(c)
   229  			}
   230  		},
   231  	}
   232  }
   233  
   234  // GetConfig for function command
   235  func GetConfig() cli.Command {
   236  	f := fnsCmd{}
   237  	return cli.Command{
   238  		Name:        "function",
   239  		ShortName:   "func",
   240  		Aliases:     []string{"f", "fn"},
   241  		Category:    "MANAGEMENT COMMAND",
   242  		Usage:       "Inspect configuration key for this function",
   243  		Description: "This command gets the configuration of a specific function for an application.",
   244  		Before: func(c *cli.Context) error {
   245  			var err error
   246  			f.provider, err = client.CurrentProvider()
   247  			if err != nil {
   248  				return err
   249  			}
   250  			f.client = f.provider.APIClientv2()
   251  			return nil
   252  		},
   253  		ArgsUsage: "<app-name> <function-name> <key>",
   254  		Action:    f.getConfig,
   255  		BashComplete: func(c *cli.Context) {
   256  			switch len(c.Args()) {
   257  			case 0:
   258  				app.BashCompleteApps(c)
   259  			case 1:
   260  				BashCompleteFns(c)
   261  			case 2:
   262  				fn, err := getFnByAppAndFnName(c.Args()[0], c.Args()[1])
   263  				if err != nil {
   264  					return
   265  				}
   266  				for key := range fn.Config {
   267  					fmt.Println(key)
   268  				}
   269  			}
   270  		},
   271  	}
   272  }
   273  
   274  // SetConfig for function command
   275  func SetConfig() cli.Command {
   276  	f := fnsCmd{}
   277  	return cli.Command{
   278  		Name:        "function",
   279  		ShortName:   "func",
   280  		Aliases:     []string{"f", "fn"},
   281  		Category:    "MANAGEMENT COMMAND",
   282  		Usage:       "Store a configuration key for this function",
   283  		Description: "This command sets the configuration of a specific function for an application.",
   284  		Before: func(c *cli.Context) error {
   285  			var err error
   286  			f.provider, err = client.CurrentProvider()
   287  			if err != nil {
   288  				return err
   289  			}
   290  			f.client = f.provider.APIClientv2()
   291  			return nil
   292  		},
   293  		ArgsUsage: "<app-name> <function-name> <key> <value>",
   294  		Action:    f.setConfig,
   295  		BashComplete: func(c *cli.Context) {
   296  			switch len(c.Args()) {
   297  			case 0:
   298  				app.BashCompleteApps(c)
   299  			case 1:
   300  				BashCompleteFns(c)
   301  			}
   302  		},
   303  	}
   304  }
   305  
   306  // ListConfig for function command
   307  func ListConfig() cli.Command {
   308  	f := fnsCmd{}
   309  	return cli.Command{
   310  		Name:        "function",
   311  		ShortName:   "func",
   312  		Aliases:     []string{"f", "fn"},
   313  		Category:    "MANAGEMENT COMMAND",
   314  		Usage:       "List configuration key/value pairs for this function",
   315  		Description: "This command returns a list of configurations for a specific function.",
   316  		Before: func(c *cli.Context) error {
   317  			var err error
   318  			f.provider, err = client.CurrentProvider()
   319  			if err != nil {
   320  				return err
   321  			}
   322  			f.client = f.provider.APIClientv2()
   323  			return nil
   324  		},
   325  		ArgsUsage: "<app-name> <function-name>",
   326  		Action:    f.listConfig,
   327  		BashComplete: func(c *cli.Context) {
   328  			switch len(c.Args()) {
   329  			case 0:
   330  				app.BashCompleteApps(c)
   331  			case 1:
   332  				BashCompleteFns(c)
   333  			}
   334  		},
   335  	}
   336  }
   337  
   338  // UnsetConfig for function command
   339  func UnsetConfig() cli.Command {
   340  	f := fnsCmd{}
   341  	return cli.Command{
   342  		Name:        "function",
   343  		ShortName:   "func",
   344  		Aliases:     []string{"f", "fn"},
   345  		Category:    "MANAGEMENT COMMAND",
   346  		Usage:       "Remove a configuration key for this function",
   347  		Description: "This command removes a configuration of a specific function.",
   348  		Before: func(c *cli.Context) error {
   349  			var err error
   350  			f.provider, err = client.CurrentProvider()
   351  			if err != nil {
   352  				return err
   353  			}
   354  			f.client = f.provider.APIClientv2()
   355  			return nil
   356  		},
   357  		ArgsUsage: "<app-name> <function-name> <key>",
   358  		Action:    f.unsetConfig,
   359  		BashComplete: func(c *cli.Context) {
   360  			switch len(c.Args()) {
   361  			case 0:
   362  				app.BashCompleteApps(c)
   363  			case 1:
   364  				BashCompleteFns(c)
   365  			case 2:
   366  				fn, err := getFnByAppAndFnName(c.Args()[0], c.Args()[1])
   367  				if err != nil {
   368  					return
   369  				}
   370  				for key := range fn.Config {
   371  					fmt.Println(key)
   372  				}
   373  			}
   374  		},
   375  	}
   376  }