github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+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 BuildpackUrl(string, string) 12 Memory(string, int64) 13 Service(string, string) 14 StartCommand(string, string) 15 EnvironmentVars(string, string, string) 16 HealthCheckTimeout(string, int) 17 Instances(string, int) 18 Domain(string, string, string) 19 GetContents() []models.Application 20 FileSavePath(string) 21 Save() error 22 } 23 24 type appManifest struct { 25 savePath string 26 contents []models.Application 27 } 28 29 func NewGenerator() AppManifest { 30 return &appManifest{} 31 } 32 33 func (m *appManifest) FileSavePath(savePath string) { 34 m.savePath = savePath 35 } 36 37 func (m *appManifest) Memory(appName string, memory int64) { 38 i := m.findOrCreateApplication(appName) 39 m.contents[i].Memory = memory 40 } 41 42 func (m *appManifest) StartCommand(appName string, cmd string) { 43 i := m.findOrCreateApplication(appName) 44 m.contents[i].Command = cmd 45 } 46 47 func (m *appManifest) BuildpackUrl(appName string, url string) { 48 i := m.findOrCreateApplication(appName) 49 m.contents[i].BuildpackUrl = url 50 } 51 52 func (m *appManifest) HealthCheckTimeout(appName string, timeout int) { 53 i := m.findOrCreateApplication(appName) 54 m.contents[i].HealthCheckTimeout = timeout 55 } 56 57 func (m *appManifest) Instances(appName string, instances int) { 58 i := m.findOrCreateApplication(appName) 59 m.contents[i].InstanceCount = instances 60 } 61 62 func (m *appManifest) Service(appName string, name string) { 63 i := m.findOrCreateApplication(appName) 64 m.contents[i].Services = append(m.contents[i].Services, models.ServicePlanSummary{ 65 Guid: "", 66 Name: name, 67 }) 68 } 69 70 func (m *appManifest) Domain(appName string, host string, domain string) { 71 i := m.findOrCreateApplication(appName) 72 m.contents[i].Routes = append(m.contents[i].Routes, models.RouteSummary{ 73 Host: host, 74 Domain: models.DomainFields{ 75 Name: domain, 76 }, 77 }) 78 } 79 80 func (m *appManifest) EnvironmentVars(appName string, key, value string) { 81 i := m.findOrCreateApplication(appName) 82 m.contents[i].EnvironmentVars[key] = value 83 } 84 85 func (m *appManifest) GetContents() []models.Application { 86 return m.contents 87 } 88 89 func (m *appManifest) Save() error { 90 f, err := os.Create(m.savePath) 91 if err != nil { 92 return err 93 } 94 defer f.Close() 95 96 _, err = fmt.Fprintln(f, "---\napplications:") 97 98 for _, app := range m.contents { 99 if _, err := fmt.Fprintf(f, "- name: %s\n", app.Name); err != nil { 100 return err 101 } 102 103 if _, err := fmt.Fprintf(f, " memory: %dM\n", app.Memory); err != nil { 104 return err 105 } 106 107 if _, err := fmt.Fprintf(f, " instances: %d\n", app.InstanceCount); err != nil { 108 return err 109 } 110 111 if app.BuildpackUrl != "" { 112 if _, err := fmt.Fprintf(f, " buildpack: %s\n", app.BuildpackUrl); err != nil { 113 return err 114 } 115 } 116 117 if app.HealthCheckTimeout > 0 { 118 if _, err := fmt.Fprintf(f, " timeout: %d\n", app.HealthCheckTimeout); err != nil { 119 return err 120 } 121 } 122 123 if app.Command != "" { 124 if _, err := fmt.Fprintf(f, " command: %s\n", app.Command); err != nil { 125 return err 126 } 127 } 128 129 if len(app.Routes) > 0 { 130 if len(app.Routes) == 1 { 131 if _, err := fmt.Fprintf(f, " host: %s\n", app.Routes[0].Host); err != nil { 132 return err 133 } 134 if _, err := fmt.Fprintf(f, " domain: %s\n", app.Routes[0].Domain.Name); err != nil { 135 return err 136 } 137 } else { 138 if err := writeRoutesToFile(f, app.Routes); err != nil { 139 return err 140 } 141 } 142 } else { 143 if _, err := fmt.Fprintf(f, " no-route: true\n"); err != nil { 144 return err 145 } 146 } 147 148 if len(app.Services) > 0 { 149 if err := writeServicesToFile(f, app.Services); err != nil { 150 return err 151 } 152 } 153 154 if len(app.EnvironmentVars) > 0 { 155 if err := writeEnvironmentVarToFile(f, app.EnvironmentVars); err != nil { 156 return err 157 } 158 } 159 160 } 161 return nil 162 } 163 164 func (m *appManifest) findOrCreateApplication(name string) int { 165 for i, app := range m.contents { 166 if app.Name == name { 167 return i 168 } 169 } 170 m.addApplication(name) 171 return len(m.contents) - 1 172 } 173 174 func (m *appManifest) addApplication(name string) { 175 m.contents = append(m.contents, models.Application{ 176 ApplicationFields: models.ApplicationFields{ 177 Name: name, 178 EnvironmentVars: make(map[string]interface{}), 179 }, 180 }) 181 } 182 func writeRoutesToFile(f *os.File, routes []models.RouteSummary) error { 183 var ( 184 hostSlice []string 185 domainSlice []string 186 hostPSlice *[]string 187 domainPSlice *[]string 188 hosts []string 189 domains []string 190 ) 191 192 for i := 0; i < len(routes); i++ { 193 hostSlice = append(hostSlice, routes[i].Host) 194 domainSlice = append(domainSlice, routes[i].Domain.Name) 195 } 196 197 hostPSlice = removeDuplicatedValue(hostSlice) 198 domainPSlice = removeDuplicatedValue(domainSlice) 199 200 if hostPSlice != nil { 201 hosts = *hostPSlice 202 } 203 if domainPSlice != nil { 204 domains = *domainPSlice 205 } 206 207 if len(hosts) == 1 { 208 if _, err := fmt.Fprintf(f, " host: %s\n", hosts[0]); err != nil { 209 return err 210 } 211 } else { 212 if _, err := fmt.Fprintln(f, " hosts:"); err != nil { 213 return err 214 } 215 for i := 0; i < len(hosts); i++ { 216 if _, err := fmt.Fprintf(f, " - %s\n", hosts[i]); err != nil { 217 return err 218 } 219 } 220 } 221 222 if len(domains) == 1 { 223 if _, err := fmt.Fprintf(f, " domain: %s\n", domains[0]); err != nil { 224 return err 225 } 226 } else { 227 if _, err := fmt.Fprintln(f, " domains:"); err != nil { 228 return err 229 } 230 for i := 0; i < len(domains); i++ { 231 if _, err := fmt.Fprintf(f, " - %s\n", domains[i]); err != nil { 232 return err 233 } 234 } 235 } 236 237 return nil 238 } 239 func writeServicesToFile(f *os.File, entries []models.ServicePlanSummary) error { 240 _, err := fmt.Fprintln(f, " services:") 241 if err != nil { 242 return err 243 } 244 for _, service := range entries { 245 _, err = fmt.Fprintf(f, " - %s\n", service.Name) 246 if err != nil { 247 return err 248 } 249 } 250 251 return nil 252 } 253 254 func writeEnvironmentVarToFile(f *os.File, envVars map[string]interface{}) error { 255 _, err := fmt.Fprintln(f, " env:") 256 if err != nil { 257 return err 258 } 259 for k, v := range envVars { 260 _, err = fmt.Fprintf(f, " %s: %s\n", k, v) 261 if err != nil { 262 return err 263 } 264 } 265 266 return nil 267 }