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