github.com/LukasHeimann/cloudfoundrycli/v8@v8.4.4/command/v7/create_buildpack_command.go (about)

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