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 }