github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+incompatible/cf/manifest/generate_manifest.go (about) 1 package manifest 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/cloudfoundry/cli/cf/models" 8 ) 9 10 type AppManifest interface { 11 Memory(string, int64) 12 Service(string, string) 13 StartupCommand(string, string) 14 EnvironmentVars(string, string, string) 15 HealthCheckTimeout(string, int) 16 Instances(string, int) 17 Domain(string, string, string) 18 GetContents() []models.Application 19 FileSavePath(string) 20 Save() error 21 } 22 23 type appManifest struct { 24 savePath string 25 contents []models.Application 26 } 27 28 func NewGenerator() AppManifest { 29 return &appManifest{} 30 } 31 32 func (m *appManifest) FileSavePath(savePath string) { 33 m.savePath = savePath 34 } 35 36 func (m *appManifest) Memory(appName string, memory int64) { 37 i := m.findOrCreateApplication(appName) 38 m.contents[i].Memory = memory 39 } 40 41 func (m *appManifest) StartupCommand(appName string, cmd string) { 42 i := m.findOrCreateApplication(appName) 43 m.contents[i].Command = cmd 44 } 45 46 func (m *appManifest) BuildpackUrl(appName string, url string) { 47 i := m.findOrCreateApplication(appName) 48 m.contents[i].BuildpackUrl = url 49 } 50 51 func (m *appManifest) StartCommand(appName string, cmd string) { 52 i := m.findOrCreateApplication(appName) 53 m.contents[i].Command = cmd 54 } 55 56 func (m *appManifest) HealthCheckTimeout(appName string, timeout int) { 57 i := m.findOrCreateApplication(appName) 58 m.contents[i].HealthCheckTimeout = timeout 59 } 60 61 func (m *appManifest) Instances(appName string, instances int) { 62 i := m.findOrCreateApplication(appName) 63 m.contents[i].InstanceCount = instances 64 } 65 66 func (m *appManifest) Service(appName string, name string) { 67 i := m.findOrCreateApplication(appName) 68 m.contents[i].Services = append(m.contents[i].Services, models.ServicePlanSummary{ 69 Guid: "", 70 Name: name, 71 }) 72 } 73 74 func (m *appManifest) Domain(appName string, host string, domain string) { 75 i := m.findOrCreateApplication(appName) 76 m.contents[i].Routes = append(m.contents[i].Routes, models.RouteSummary{ 77 Host: host, 78 Domain: models.DomainFields{ 79 Name: domain, 80 }, 81 }) 82 } 83 84 func (m *appManifest) EnvironmentVars(appName string, key, value string) { 85 i := m.findOrCreateApplication(appName) 86 m.contents[i].EnvironmentVars[key] = value 87 } 88 89 func (m *appManifest) GetContents() []models.Application { 90 return m.contents 91 } 92 93 func (m *appManifest) Save() error { 94 f, err := os.Create(m.savePath) 95 if err != nil { 96 return err 97 } 98 defer f.Close() 99 100 _, err = fmt.Fprintln(f, "---\napplications:") 101 102 for _, app := range m.contents { 103 if _, err := fmt.Fprintf(f, "- name: %s\n", app.Name); err != nil { 104 return err 105 } 106 107 if _, err := fmt.Fprintf(f, " memory: %dM\n", app.Memory); err != nil { 108 return err 109 } 110 111 if _, err := fmt.Fprintf(f, " instances: %d\n", app.InstanceCount); err != nil { 112 return err 113 } 114 115 if app.BuildpackUrl != "" { 116 if _, err := fmt.Fprintf(f, " buildpack: %s\n", app.BuildpackUrl); err != nil { 117 return err 118 } 119 } 120 121 if app.HealthCheckTimeout > 0 { 122 if _, err := fmt.Fprintf(f, " timeout: %d\n", app.HealthCheckTimeout); err != nil { 123 return err 124 } 125 } 126 127 if app.Command != "" { 128 if _, err := fmt.Fprintf(f, " command: %s\n", app.Command); err != nil { 129 return err 130 } 131 } 132 133 if len(app.Routes) > 0 { 134 if _, err := fmt.Fprintf(f, " host: %s\n", app.Routes[0].Host); err != nil { 135 return err 136 } 137 if _, err := fmt.Fprintf(f, " domain: %s\n", app.Routes[0].Domain.Name); err != nil { 138 return err 139 } 140 } else { 141 if _, err := fmt.Fprintf(f, " no-route: true\n"); err != nil { 142 return err 143 } 144 } 145 146 if len(app.Services) > 0 { 147 if err := writeServicesToFile(f, app.Services); err != nil { 148 return err 149 } 150 } 151 152 if len(app.EnvironmentVars) > 0 { 153 if err := writeEnvironmentVarToFile(f, app.EnvironmentVars); err != nil { 154 return err 155 } 156 } 157 158 } 159 return nil 160 } 161 162 func (m *appManifest) findOrCreateApplication(name string) int { 163 for i, app := range m.contents { 164 if app.Name == name { 165 return i 166 } 167 } 168 m.addApplication(name) 169 return len(m.contents) - 1 170 } 171 172 func (m *appManifest) addApplication(name string) { 173 m.contents = append(m.contents, models.Application{ 174 ApplicationFields: models.ApplicationFields{ 175 Name: name, 176 EnvironmentVars: make(map[string]interface{}), 177 }, 178 }) 179 } 180 181 func writeServicesToFile(f *os.File, entries []models.ServicePlanSummary) error { 182 _, err := fmt.Fprintln(f, " services:") 183 if err != nil { 184 return err 185 } 186 for _, service := range entries { 187 _, err = fmt.Fprintf(f, " - %s\n", service.Name) 188 if err != nil { 189 return err 190 } 191 } 192 193 return nil 194 } 195 196 func writeEnvironmentVarToFile(f *os.File, envVars map[string]interface{}) error { 197 _, err := fmt.Fprintln(f, " env:") 198 if err != nil { 199 return err 200 } 201 for k, v := range envVars { 202 _, err = fmt.Fprintf(f, " %s: %s\n", k, v) 203 if err != nil { 204 return err 205 } 206 } 207 208 return nil 209 }