github.com/orange-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 }