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  }