github.com/niteshexa/cloudfoundry_cli@v7.1.0+incompatible/command/v7/create_buildpack_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/cli/actor/v7action"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    10  	"code.cloudfoundry.org/cli/command"
    11  	"code.cloudfoundry.org/cli/command/flag"
    12  	"code.cloudfoundry.org/cli/command/translatableerror"
    13  	"code.cloudfoundry.org/cli/types"
    14  	"code.cloudfoundry.org/cli/util/download"
    15  )
    16  
    17  type CreateBuildpackCommand struct {
    18  	BaseCommand
    19  
    20  	RequiredArgs    flag.CreateBuildpackArgs `positional-args:"Yes"`
    21  	usage           interface{}              `usage:"CF_NAME create-buildpack BUILDPACK PATH POSITION [--disable]\n\nTIP:\n   Path should be a zip file, a url to a zip file, or a local directory. Position is a positive integer, sets priority, and is sorted from lowest to highest."`
    22  	relatedCommands interface{}              `related_commands:"buildpacks, push"`
    23  	Disable         bool                     `long:"disable" description:"Disable the buildpack from being used for staging"`
    24  
    25  	ProgressBar v7action.SimpleProgressBar
    26  }
    27  
    28  func (cmd *CreateBuildpackCommand) Setup(config command.Config, ui command.UI) error {
    29  	cmd.ProgressBar = v7action.NewProgressBar()
    30  	return cmd.BaseCommand.Setup(config, ui)
    31  }
    32  
    33  func (cmd CreateBuildpackCommand) Execute(args []string) error {
    34  	err := cmd.SharedActor.CheckTarget(false, false)
    35  	if err != nil {
    36  		return err
    37  	}
    38  
    39  	user, err := cmd.Config.CurrentUser()
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	cmd.UI.DisplayTextWithFlavor("Creating buildpack {{.BuildpackName}} as {{.Username}}...", map[string]interface{}{
    45  		"Username":      user.Name,
    46  		"BuildpackName": cmd.RequiredArgs.Buildpack,
    47  	})
    48  
    49  	downloader := download.NewDownloader(time.Second * 30)
    50  	tmpDirPath, err := ioutil.TempDir("", "buildpack-dir-")
    51  	if err != nil {
    52  		return err
    53  	}
    54  	defer os.RemoveAll(tmpDirPath)
    55  
    56  	pathToBuildpackBits, err := cmd.Actor.PrepareBuildpackBits(string(cmd.RequiredArgs.Path), tmpDirPath, downloader)
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	createdBuildpack, warnings, err := cmd.Actor.CreateBuildpack(v7action.Buildpack{
    62  		Name:     cmd.RequiredArgs.Buildpack,
    63  		Position: types.NullInt{IsSet: true, Value: cmd.RequiredArgs.Position},
    64  		Enabled:  types.NullBool{IsSet: true, Value: !cmd.Disable},
    65  	})
    66  	cmd.UI.DisplayWarnings(warnings)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	cmd.UI.DisplayOK()
    71  
    72  	cmd.UI.DisplayTextWithFlavor("Uploading buildpack {{.BuildpackName}} as {{.Username}}...", map[string]interface{}{
    73  		"Username":      user.Name,
    74  		"BuildpackName": cmd.RequiredArgs.Buildpack,
    75  	})
    76  	jobURL, warnings, err := cmd.Actor.UploadBuildpack(createdBuildpack.GUID, pathToBuildpackBits, cmd.ProgressBar)
    77  	if _, ok := err.(ccerror.InvalidAuthTokenError); ok {
    78  		cmd.UI.DisplayWarnings([]string{"Failed to upload buildpack due to auth token expiration, retrying..."})
    79  		jobURL, warnings, err = cmd.Actor.UploadBuildpack(createdBuildpack.GUID, pathToBuildpackBits, cmd.ProgressBar)
    80  	}
    81  	cmd.UI.DisplayWarnings(warnings)
    82  	if err != nil {
    83  		return cmd.wrapWithTip(err)
    84  	}
    85  	cmd.UI.DisplayOK()
    86  
    87  	cmd.UI.DisplayTextWithFlavor("Processing uploaded buildpack {{.BuildpackName}}...", map[string]interface{}{
    88  		"BuildpackName": cmd.RequiredArgs.Buildpack,
    89  	})
    90  	warnings, err = cmd.Actor.PollUploadBuildpackJob(jobURL)
    91  	cmd.UI.DisplayWarnings(warnings)
    92  
    93  	if err != nil {
    94  		return cmd.wrapWithTip(err)
    95  	}
    96  
    97  	cmd.UI.DisplayOK()
    98  	return nil
    99  }
   100  
   101  func (cmd CreateBuildpackCommand) wrapWithTip(err error) error {
   102  	return translatableerror.TipDecoratorError{
   103  		BaseError: err,
   104  		Tip:       "A buildpack with name '{{.BuildpackName}}' and nil stack has been created. Use '{{.CfDeleteBuildpackCommand}}' to delete it or '{{.CfUpdateBuildpackCommand}}' to try again.",
   105  		TipKeys: map[string]interface{}{
   106  			"BuildpackName":            cmd.RequiredArgs.Buildpack,
   107  			"CfDeleteBuildpackCommand": cmd.Config.BinaryName() + " delete-buildpack",
   108  			"CfUpdateBuildpackCommand": cmd.Config.BinaryName() + " update-buildpack",
   109  		},
   110  	}
   111  }