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  }