github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/cf/models/application.go (about)

     1  package models
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"strings"
     7  	"time"
     8  )
     9  
    10  type Application struct {
    11  	ApplicationFields
    12  	Stack    *Stack
    13  	Routes   []RouteSummary
    14  	Services []ServicePlanSummary
    15  }
    16  
    17  func (model Application) HasRoute(route Route) bool {
    18  	for _, boundRoute := range model.Routes {
    19  		if boundRoute.GUID == route.GUID {
    20  			return true
    21  		}
    22  	}
    23  	return false
    24  }
    25  
    26  func (model Application) ToParams() AppParams {
    27  	state := strings.ToUpper(model.State)
    28  	params := AppParams{
    29  		GUID:                    &model.GUID,
    30  		Name:                    &model.Name,
    31  		BuildpackURL:            &model.BuildpackURL,
    32  		Command:                 &model.Command,
    33  		DiskQuota:               &model.DiskQuota,
    34  		InstanceCount:           &model.InstanceCount,
    35  		HealthCheckType:         &model.HealthCheckType,
    36  		HealthCheckHTTPEndpoint: &model.HealthCheckHTTPEndpoint,
    37  		Memory:                  &model.Memory,
    38  		State:                   &state,
    39  		SpaceGUID:               &model.SpaceGUID,
    40  		EnvironmentVars:         &model.EnvironmentVars,
    41  		DockerImage:             &model.DockerImage,
    42  	}
    43  
    44  	if model.Stack != nil {
    45  		params.StackGUID = &model.Stack.GUID
    46  	}
    47  
    48  	return params
    49  }
    50  
    51  type ApplicationFields struct {
    52  	GUID                    string
    53  	Name                    string
    54  	BuildpackURL            string
    55  	Command                 string
    56  	Diego                   bool
    57  	DetectedStartCommand    string
    58  	DiskQuota               int64 // in Megabytes
    59  	EnvironmentVars         map[string]interface{}
    60  	InstanceCount           int
    61  	Memory                  int64 // in Megabytes
    62  	RunningInstances        int
    63  	HealthCheckType         string
    64  	HealthCheckHTTPEndpoint string
    65  	HealthCheckTimeout      int
    66  	State                   string
    67  	SpaceGUID               string
    68  	StackGUID               string
    69  	PackageUpdatedAt        *time.Time
    70  	PackageState            string
    71  	StagingFailedReason     string
    72  	Buildpack               string
    73  	DetectedBuildpack       string
    74  	DockerImage             string
    75  	EnableSSH               bool
    76  }
    77  
    78  const (
    79  	ApplicationStateStopped  = "stopped"
    80  	ApplicationStateStarted  = "started"
    81  	ApplicationStateRunning  = "running"
    82  	ApplicationStateCrashed  = "crashed"
    83  	ApplicationStateFlapping = "flapping"
    84  	ApplicationStateDown     = "down"
    85  	ApplicationStateStarting = "starting"
    86  )
    87  
    88  type AppParams struct {
    89  	BuildpackURL            *string
    90  	Buildpacks              []string
    91  	Command                 *string
    92  	DiskQuota               *int64
    93  	Domains                 []string
    94  	EnvironmentVars         *map[string]interface{}
    95  	GUID                    *string
    96  	HealthCheckType         *string
    97  	HealthCheckHTTPEndpoint *string
    98  	HealthCheckTimeout      *int
    99  	DockerImage             *string
   100  	DockerUsername          *string
   101  	DockerPassword          *string
   102  	EnableSSH               *bool
   103  	Hosts                   []string
   104  	RoutePath               *string
   105  	InstanceCount           *int
   106  	Memory                  *int64
   107  	Name                    *string
   108  	NoHostname              *bool
   109  	NoRoute                 bool
   110  	UseRandomRoute          bool
   111  	UseRandomPort           bool
   112  	Path                    *string
   113  	ServicesToBind          []string
   114  	SpaceGUID               *string
   115  	StackGUID               *string
   116  	StackName               *string
   117  	State                   *string
   118  	PackageUpdatedAt        *time.Time
   119  	Routes                  []ManifestRoute
   120  }
   121  
   122  func (app *AppParams) Merge(flagContext *AppParams) {
   123  	if flagContext.BuildpackURL != nil {
   124  		app.BuildpackURL = flagContext.BuildpackURL
   125  	}
   126  	if flagContext.Command != nil {
   127  		app.Command = flagContext.Command
   128  	}
   129  	if flagContext.DiskQuota != nil {
   130  		app.DiskQuota = flagContext.DiskQuota
   131  	}
   132  	if flagContext.DockerImage != nil {
   133  		app.DockerImage = flagContext.DockerImage
   134  	}
   135  
   136  	switch {
   137  	case flagContext.DockerUsername != nil:
   138  		app.DockerUsername = flagContext.DockerUsername
   139  		// the password is always non-nil after we parse the flag context
   140  		app.DockerPassword = flagContext.DockerPassword
   141  	case app.DockerUsername != nil:
   142  		password := os.Getenv("CF_DOCKER_PASSWORD")
   143  		// if the password is empty, we will get a CC error
   144  		app.DockerPassword = &password
   145  	}
   146  
   147  	if flagContext.Domains != nil {
   148  		app.Domains = flagContext.Domains
   149  	}
   150  	if flagContext.EnableSSH != nil {
   151  		app.EnableSSH = flagContext.EnableSSH
   152  	}
   153  	if flagContext.EnvironmentVars != nil {
   154  		app.EnvironmentVars = flagContext.EnvironmentVars
   155  	}
   156  	if flagContext.GUID != nil {
   157  		app.GUID = flagContext.GUID
   158  	}
   159  	if flagContext.HealthCheckType != nil {
   160  		app.HealthCheckType = flagContext.HealthCheckType
   161  	}
   162  	if flagContext.HealthCheckHTTPEndpoint != nil {
   163  		app.HealthCheckHTTPEndpoint = flagContext.HealthCheckHTTPEndpoint
   164  	}
   165  	if flagContext.HealthCheckTimeout != nil {
   166  		app.HealthCheckTimeout = flagContext.HealthCheckTimeout
   167  	}
   168  	if flagContext.Hosts != nil {
   169  		app.Hosts = flagContext.Hosts
   170  	}
   171  	if flagContext.InstanceCount != nil {
   172  		app.InstanceCount = flagContext.InstanceCount
   173  	}
   174  	if flagContext.Memory != nil {
   175  		app.Memory = flagContext.Memory
   176  	}
   177  	if flagContext.Name != nil {
   178  		app.Name = flagContext.Name
   179  	}
   180  	if flagContext.Path != nil {
   181  		app.Path = flagContext.Path
   182  	}
   183  	if flagContext.RoutePath != nil {
   184  		app.RoutePath = flagContext.RoutePath
   185  	}
   186  	if flagContext.ServicesToBind != nil {
   187  		app.ServicesToBind = flagContext.ServicesToBind
   188  	}
   189  	if flagContext.SpaceGUID != nil {
   190  		app.SpaceGUID = flagContext.SpaceGUID
   191  	}
   192  	if flagContext.StackGUID != nil {
   193  		app.StackGUID = flagContext.StackGUID
   194  	}
   195  	if flagContext.StackName != nil {
   196  		app.StackName = flagContext.StackName
   197  	}
   198  	if flagContext.State != nil {
   199  		app.State = flagContext.State
   200  	}
   201  
   202  	app.NoRoute = app.NoRoute || flagContext.NoRoute
   203  	noHostBool := app.IsNoHostnameTrue() || flagContext.IsNoHostnameTrue()
   204  	app.NoHostname = &noHostBool
   205  	app.UseRandomRoute = app.UseRandomRoute || flagContext.UseRandomRoute
   206  }
   207  
   208  func (app *AppParams) IsEmpty() bool {
   209  	noHostBool := false
   210  	return reflect.DeepEqual(*app, AppParams{NoHostname: &noHostBool})
   211  }
   212  
   213  func (app *AppParams) IsHostEmpty() bool {
   214  	return app.Hosts == nil || len(app.Hosts) == 0
   215  }
   216  
   217  func (app *AppParams) IsNoHostnameTrue() bool {
   218  	if app.NoHostname == nil {
   219  		return false
   220  	}
   221  	return *app.NoHostname
   222  }