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 }