github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/cf/commands/create_app_manifest.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  
     7  	"github.com/cloudfoundry/cli/cf/flag_helpers"
     8  	. "github.com/cloudfoundry/cli/cf/i18n"
     9  
    10  	"github.com/cloudfoundry/cli/cf/api"
    11  	"github.com/cloudfoundry/cli/cf/api/app_instances"
    12  	"github.com/cloudfoundry/cli/cf/command_metadata"
    13  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    14  	"github.com/cloudfoundry/cli/cf/manifest"
    15  	"github.com/cloudfoundry/cli/cf/models"
    16  	"github.com/cloudfoundry/cli/cf/requirements"
    17  	"github.com/cloudfoundry/cli/cf/terminal"
    18  	"github.com/codegangsta/cli"
    19  )
    20  
    21  type AppManifestCreater interface {
    22  	CreateAppManifest(app models.Application, orgName string, spaceName string)
    23  }
    24  
    25  type CreateAppManifest struct {
    26  	ui               terminal.UI
    27  	config           core_config.Reader
    28  	appSummaryRepo   api.AppSummaryRepository
    29  	appInstancesRepo app_instances.AppInstancesRepository
    30  	appReq           requirements.ApplicationRequirement
    31  	manifest         manifest.AppManifest
    32  }
    33  
    34  func NewCreateAppManifest(ui terminal.UI, config core_config.Reader, appSummaryRepo api.AppSummaryRepository, manifestGenerator manifest.AppManifest) (cmd *CreateAppManifest) {
    35  	cmd = new(CreateAppManifest)
    36  	cmd.ui = ui
    37  	cmd.config = config
    38  	cmd.appSummaryRepo = appSummaryRepo
    39  	cmd.manifest = manifestGenerator
    40  	return
    41  }
    42  
    43  func (cmd *CreateAppManifest) Metadata() command_metadata.CommandMetadata {
    44  	return command_metadata.CommandMetadata{
    45  		Name:        "create-app-manifest",
    46  		Description: T("Create an app manifest for an app that has been pushed successfully."),
    47  		Usage:       T("CF_NAME create-app-manifest APP [-p /path/to/<app-name>-manifest.yml ]"),
    48  		Flags: []cli.Flag{
    49  			flag_helpers.NewStringFlag("p", T("Specify a path for file creation. If path not specified, manifest file is created in current working directory.")),
    50  		},
    51  	}
    52  }
    53  
    54  func (cmd *CreateAppManifest) GetRequirements(requirementsFactory requirements.Factory, c *cli.Context) (reqs []requirements.Requirement, err error) {
    55  	if len(c.Args()) != 1 {
    56  		cmd.ui.FailWithUsage(c)
    57  	}
    58  
    59  	cmd.appReq = requirementsFactory.NewApplicationRequirement(c.Args()[0])
    60  
    61  	reqs = []requirements.Requirement{
    62  		requirementsFactory.NewLoginRequirement(),
    63  		requirementsFactory.NewTargetedSpaceRequirement(),
    64  		cmd.appReq,
    65  	}
    66  	return
    67  }
    68  
    69  func (cmd *CreateAppManifest) Run(c *cli.Context) {
    70  	app := cmd.appReq.GetApplication()
    71  
    72  	application, apiErr := cmd.appSummaryRepo.GetSummary(app.Guid)
    73  
    74  	if apiErr != nil {
    75  		cmd.ui.Failed(T("Error getting application summary: ") + apiErr.Error())
    76  	}
    77  
    78  	cmd.ui.Say(T("Creating an app manifest from current settings of app ") + application.Name + " ...")
    79  	cmd.ui.Say("")
    80  
    81  	savePath := "./" + application.Name + "_manifest.yml"
    82  
    83  	if c.String("p") != "" {
    84  		savePath = c.String("p")
    85  	}
    86  
    87  	cmd.createManifest(application, savePath)
    88  }
    89  
    90  func (cmd *CreateAppManifest) createManifest(app models.Application, savePath string) error {
    91  	cmd.manifest.FileSavePath(savePath)
    92  	cmd.manifest.Memory(app.Name, app.Memory)
    93  	cmd.manifest.Instances(app.Name, app.InstanceCount)
    94  
    95  	if app.Command != "" {
    96  		cmd.manifest.StartupCommand(app.Name, app.Command)
    97  	}
    98  
    99  	if len(app.Services) > 0 {
   100  		for _, service := range app.Services {
   101  			cmd.manifest.Service(app.Name, service.Name)
   102  		}
   103  	}
   104  
   105  	if app.HealthCheckTimeout > 0 {
   106  		cmd.manifest.HealthCheckTimeout(app.Name, app.HealthCheckTimeout)
   107  	}
   108  
   109  	if len(app.EnvironmentVars) > 0 {
   110  		sorted := sortEnvVar(app.EnvironmentVars)
   111  		for _, envVarKey := range sorted {
   112  			switch app.EnvironmentVars[envVarKey].(type) {
   113  			default:
   114  				cmd.ui.Failed(T("Failed to create manifest, unable to parse environment variable: ") + envVarKey)
   115  			case float64:
   116  				//json.Unmarshal turn all numbers to float64
   117  				value := int(app.EnvironmentVars[envVarKey].(float64))
   118  				cmd.manifest.EnvironmentVars(app.Name, envVarKey, fmt.Sprintf("%d", value))
   119  			case bool:
   120  				cmd.manifest.EnvironmentVars(app.Name, envVarKey, fmt.Sprintf("%t", app.EnvironmentVars[envVarKey].(bool)))
   121  			case string:
   122  				cmd.manifest.EnvironmentVars(app.Name, envVarKey, "\""+app.EnvironmentVars[envVarKey].(string)+"\"")
   123  			}
   124  		}
   125  	}
   126  
   127  	if len(app.Routes) > 0 {
   128  		cmd.manifest.Domain(app.Name, app.Routes[0].Host, app.Routes[0].Domain.Name)
   129  	}
   130  
   131  	err := cmd.manifest.Save()
   132  	if err != nil {
   133  		cmd.ui.Failed(T("Error creating manifest file: ") + err.Error())
   134  	}
   135  
   136  	cmd.ui.Ok()
   137  	cmd.ui.Say(T("Manifest file created successfully at ") + savePath)
   138  	cmd.ui.Say("")
   139  
   140  	return nil
   141  }
   142  
   143  func sortEnvVar(vars map[string]interface{}) []string {
   144  	var varsAry []string
   145  	for k, _ := range vars {
   146  		varsAry = append(varsAry, k)
   147  	}
   148  	sort.Strings(varsAry)
   149  
   150  	return varsAry
   151  }