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 }