github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+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/api/cloudcontroller/ccerror" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 10 "code.cloudfoundry.org/cli/command/flag" 11 "code.cloudfoundry.org/cli/command/translatableerror" 12 "code.cloudfoundry.org/cli/util/download" 13 "code.cloudfoundry.org/clock" 14 15 "code.cloudfoundry.org/cli/actor/sharedaction" 16 "code.cloudfoundry.org/cli/actor/v7action" 17 "code.cloudfoundry.org/cli/command" 18 "code.cloudfoundry.org/cli/command/v7/shared" 19 "code.cloudfoundry.org/cli/types" 20 ) 21 22 //go:generate counterfeiter . CreateBuildpackActor 23 24 type CreateBuildpackActor interface { 25 CreateBuildpack(buildpack v7action.Buildpack) (v7action.Buildpack, v7action.Warnings, error) 26 UploadBuildpack(guid string, pathToBuildpackBits string, progressBar v7action.SimpleProgressBar) (ccv3.JobURL, v7action.Warnings, error) 27 PrepareBuildpackBits(inputPath string, tmpDirPath string, downloader v7action.Downloader) (string, error) 28 PollUploadBuildpackJob(jobURL ccv3.JobURL) (v7action.Warnings, error) 29 } 30 31 type CreateBuildpackCommand struct { 32 RequiredArgs flag.CreateBuildpackArgs `positional-args:"Yes"` 33 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."` 34 relatedCommands interface{} `related_commands:"buildpacks, push"` 35 Disable bool `long:"disable" description:"Disable the buildpack from being used for staging"` 36 37 UI command.UI 38 Config command.Config 39 ProgressBar v7action.SimpleProgressBar 40 SharedActor command.SharedActor 41 Actor CreateBuildpackActor 42 } 43 44 func (cmd *CreateBuildpackCommand) Setup(config command.Config, ui command.UI) error { 45 cmd.UI = ui 46 cmd.Config = config 47 sharedActor := sharedaction.NewActor(config) 48 cmd.SharedActor = sharedActor 49 50 ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui, "") 51 if err != nil { 52 return err 53 } 54 cmd.Actor = v7action.NewActor(ccClient, config, sharedActor, uaaClient, clock.NewClock()) 55 cmd.ProgressBar = v7action.NewProgressBar() 56 57 return nil 58 } 59 60 func (cmd CreateBuildpackCommand) Execute(args []string) error { 61 err := cmd.SharedActor.CheckTarget(false, false) 62 if err != nil { 63 return err 64 } 65 66 user, err := cmd.Config.CurrentUser() 67 if err != nil { 68 return err 69 } 70 71 cmd.UI.DisplayTextWithFlavor("Creating buildpack {{.BuildpackName}} as {{.Username}}...", map[string]interface{}{ 72 "Username": user.Name, 73 "BuildpackName": cmd.RequiredArgs.Buildpack, 74 }) 75 76 downloader := download.NewDownloader(time.Second * 30) 77 tmpDirPath, err := ioutil.TempDir("", "buildpack-dir-") 78 if err != nil { 79 return err 80 } 81 defer os.RemoveAll(tmpDirPath) 82 83 pathToBuildpackBits, err := cmd.Actor.PrepareBuildpackBits(string(cmd.RequiredArgs.Path), tmpDirPath, downloader) 84 if err != nil { 85 return err 86 } 87 88 createdBuildpack, warnings, err := cmd.Actor.CreateBuildpack(v7action.Buildpack{ 89 Name: cmd.RequiredArgs.Buildpack, 90 Position: types.NullInt{IsSet: true, Value: cmd.RequiredArgs.Position}, 91 Enabled: types.NullBool{IsSet: true, Value: !cmd.Disable}, 92 }) 93 cmd.UI.DisplayWarnings(warnings) 94 if err != nil { 95 return err 96 } 97 cmd.UI.DisplayOK() 98 99 cmd.UI.DisplayTextWithFlavor("Uploading buildpack {{.BuildpackName}} as {{.Username}}...", map[string]interface{}{ 100 "Username": user.Name, 101 "BuildpackName": cmd.RequiredArgs.Buildpack, 102 }) 103 jobURL, warnings, err := cmd.Actor.UploadBuildpack(createdBuildpack.GUID, pathToBuildpackBits, cmd.ProgressBar) 104 if _, ok := err.(ccerror.InvalidAuthTokenError); ok { 105 cmd.UI.DisplayWarnings([]string{"Failed to upload buildpack due to auth token expiration, retrying..."}) 106 jobURL, warnings, err = cmd.Actor.UploadBuildpack(createdBuildpack.GUID, pathToBuildpackBits, cmd.ProgressBar) 107 } 108 cmd.UI.DisplayWarnings(warnings) 109 if err != nil { 110 return cmd.wrapWithTip(err) 111 } 112 cmd.UI.DisplayOK() 113 114 cmd.UI.DisplayTextWithFlavor("Processing uploaded buildpack {{.BuildpackName}}...", map[string]interface{}{ 115 "BuildpackName": cmd.RequiredArgs.Buildpack, 116 }) 117 warnings, err = cmd.Actor.PollUploadBuildpackJob(jobURL) 118 cmd.UI.DisplayWarnings(warnings) 119 120 if err != nil { 121 return cmd.wrapWithTip(err) 122 } 123 124 cmd.UI.DisplayOK() 125 return nil 126 } 127 128 func (cmd CreateBuildpackCommand) wrapWithTip(err error) error { 129 return translatableerror.TipDecoratorError{ 130 BaseError: err, 131 Tip: "A buildpack with name '{{.BuildpackName}}' and nil stack has been created. Use '{{.CfDeleteBuildpackCommand}}' to delete it or '{{.CfUpdateBuildpackCommand}}' to try again.", 132 TipKeys: map[string]interface{}{ 133 "BuildpackName": cmd.RequiredArgs.Buildpack, 134 "CfDeleteBuildpackCommand": cmd.Config.BinaryName() + " delete-buildpack", 135 "CfUpdateBuildpackCommand": cmd.Config.BinaryName() + " update-buildpack", 136 }, 137 } 138 }