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  }