github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/resources/application_resource.go (about)

     1  package resources
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/api/cloudcontroller"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     6  	"encoding/json"
     7  )
     8  
     9  // Application represents a Cloud Controller V3 Application.
    10  type Application struct {
    11  	// GUID is the unique application identifier.
    12  	GUID string
    13  	// StackName is the name of the stack on which the application runs.
    14  	StackName string
    15  	// LifecycleBuildpacks is a list of the names of buildpacks.
    16  	LifecycleBuildpacks []string
    17  	// LifecycleType is the type of the lifecycle.
    18  	LifecycleType constant.AppLifecycleType
    19  	// Metadata is used for custom tagging of API resources
    20  	Metadata *Metadata
    21  	// Name is the name given to the application.
    22  	Name string
    23  	// SpaceGUID is the unique identifier of the parent space.
    24  	SpaceGUID string
    25  	// State is the desired state of the application.
    26  	State constant.ApplicationState
    27  }
    28  
    29  // ApplicationNameOnly represents only the name field of a Cloud Controller V3 Application
    30  type ApplicationNameOnly struct {
    31  	// Name is the name given to the application.
    32  	Name string `json:"name,omitempty"`
    33  }
    34  
    35  // MarshalJSON converts an Application into a Cloud Controller Application.
    36  func (a Application) MarshalJSON() ([]byte, error) {
    37  	ccApp := ccApplication{
    38  		Name:     a.Name,
    39  		Metadata: a.Metadata,
    40  	}
    41  
    42  	if a.SpaceGUID != "" {
    43  		ccApp.Relationships = Relationships{
    44  			constant.RelationshipTypeSpace: Relationship{GUID: a.SpaceGUID},
    45  		}
    46  	}
    47  
    48  	if a.LifecycleType == constant.AppLifecycleTypeDocker {
    49  		ccApp.setDockerLifecycle()
    50  	} else if a.LifecycleType == constant.AppLifecycleTypeBuildpack {
    51  		if len(a.LifecycleBuildpacks) > 0 || a.StackName != "" {
    52  			if a.hasAutodetectedBuildpack() {
    53  				ccApp.setAutodetectedBuildpackLifecycle(a)
    54  			} else {
    55  				ccApp.setBuildpackLifecycle(a)
    56  			}
    57  		}
    58  	}
    59  
    60  	return json.Marshal(ccApp)
    61  }
    62  
    63  // UnmarshalJSON helps unmarshal a Cloud Controller Application response.
    64  func (a *Application) UnmarshalJSON(data []byte) error {
    65  	lifecycle := ccLifecycle{}
    66  	ccApp := ccApplication{
    67  		Lifecycle: &lifecycle,
    68  	}
    69  
    70  	err := cloudcontroller.DecodeJSON(data, &ccApp)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	a.GUID = ccApp.GUID
    76  	a.StackName = lifecycle.Data.Stack
    77  	a.LifecycleBuildpacks = lifecycle.Data.Buildpacks
    78  	a.LifecycleType = lifecycle.Type
    79  	a.Name = ccApp.Name
    80  	a.SpaceGUID = ccApp.Relationships[constant.RelationshipTypeSpace].GUID
    81  	a.State = ccApp.State
    82  	a.Metadata = ccApp.Metadata
    83  
    84  	return nil
    85  }
    86  
    87  func (a Application) Started() bool {
    88  	return a.State == constant.ApplicationStarted
    89  }
    90  
    91  func (a Application) Stopped() bool {
    92  	return a.State == constant.ApplicationStopped
    93  }
    94  
    95  func (a Application) hasAutodetectedBuildpack() bool {
    96  	if len(a.LifecycleBuildpacks) == 0 {
    97  		return false
    98  	}
    99  	return a.LifecycleBuildpacks[0] == constant.AutodetectBuildpackValueDefault || a.LifecycleBuildpacks[0] == constant.AutodetectBuildpackValueNull
   100  }
   101  
   102  type ccLifecycle struct {
   103  	Type constant.AppLifecycleType `json:"type,omitempty"`
   104  	Data struct {
   105  		Buildpacks []string `json:"buildpacks,omitempty"`
   106  		Stack      string   `json:"stack,omitempty"`
   107  	} `json:"data"`
   108  }
   109  
   110  type ccApplication struct {
   111  	Name          string                    `json:"name,omitempty"`
   112  	Relationships Relationships             `json:"relationships,omitempty"`
   113  	Lifecycle     interface{}               `json:"lifecycle,omitempty"`
   114  	GUID          string                    `json:"guid,omitempty"`
   115  	State         constant.ApplicationState `json:"state,omitempty"`
   116  	Metadata      *Metadata                 `json:"metadata,omitempty"`
   117  }
   118  
   119  func (ccApp *ccApplication) setAutodetectedBuildpackLifecycle(a Application) {
   120  	var nullBuildpackLifecycle struct {
   121  		Type constant.AppLifecycleType `json:"type,omitempty"`
   122  		Data struct {
   123  			Buildpacks []string `json:"buildpacks"`
   124  			Stack      string   `json:"stack,omitempty"`
   125  		} `json:"data"`
   126  	}
   127  	nullBuildpackLifecycle.Type = constant.AppLifecycleTypeBuildpack
   128  	nullBuildpackLifecycle.Data.Stack = a.StackName
   129  	ccApp.Lifecycle = nullBuildpackLifecycle
   130  }
   131  
   132  func (ccApp *ccApplication) setBuildpackLifecycle(a Application) {
   133  	var lifecycle ccLifecycle
   134  	lifecycle.Type = a.LifecycleType
   135  	lifecycle.Data.Buildpacks = a.LifecycleBuildpacks
   136  	lifecycle.Data.Stack = a.StackName
   137  	ccApp.Lifecycle = lifecycle
   138  }
   139  
   140  func (ccApp *ccApplication) setDockerLifecycle() {
   141  	ccApp.Lifecycle = ccLifecycle{
   142  		Type: constant.AppLifecycleTypeDocker,
   143  	}
   144  }