github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+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  }