github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/cf/api/appinstances/app_instances.go (about) 1 package appinstances 2 3 import ( 4 "fmt" 5 "strconv" 6 "strings" 7 "time" 8 9 "code.cloudfoundry.org/cli/cf/configuration/coreconfig" 10 "code.cloudfoundry.org/cli/cf/models" 11 "code.cloudfoundry.org/cli/cf/net" 12 ) 13 14 type InstancesAPIResponse map[string]InstanceAPIResponse 15 16 type InstanceAPIResponse struct { 17 State string 18 Since float64 19 Details string 20 } 21 22 type StatsAPIResponse map[string]InstanceStatsAPIResponse 23 24 type InstanceStatsAPIResponse struct { 25 Stats struct { 26 DiskQuota int64 `json:"disk_quota"` 27 MemQuota int64 `json:"mem_quota"` 28 Usage struct { 29 CPU float64 30 Disk int64 31 Mem int64 32 } 33 } 34 } 35 36 //go:generate counterfeiter . Repository 37 38 type Repository interface { 39 GetInstances(appGUID string) (instances []models.AppInstanceFields, apiErr error) 40 DeleteInstance(appGUID string, instance int) error 41 } 42 43 type CloudControllerAppInstancesRepository struct { 44 config coreconfig.Reader 45 gateway net.Gateway 46 } 47 48 func NewCloudControllerAppInstancesRepository(config coreconfig.Reader, gateway net.Gateway) (repo CloudControllerAppInstancesRepository) { 49 repo.config = config 50 repo.gateway = gateway 51 return 52 } 53 54 func (repo CloudControllerAppInstancesRepository) GetInstances(appGUID string) (instances []models.AppInstanceFields, err error) { 55 instancesResponse := InstancesAPIResponse{} 56 err = repo.gateway.GetResource( 57 fmt.Sprintf("%s/v2/apps/%s/instances", repo.config.APIEndpoint(), appGUID), 58 &instancesResponse) 59 if err != nil { 60 return 61 } 62 63 instances = make([]models.AppInstanceFields, len(instancesResponse), len(instancesResponse)) 64 for k, v := range instancesResponse { 65 index, err := strconv.Atoi(k) 66 if err != nil { 67 continue 68 } 69 70 instances[index] = models.AppInstanceFields{ 71 State: models.InstanceState(strings.ToLower(v.State)), 72 Details: v.Details, 73 Since: time.Unix(int64(v.Since), 0), 74 } 75 } 76 77 return repo.updateInstancesWithStats(appGUID, instances) 78 } 79 80 func (repo CloudControllerAppInstancesRepository) DeleteInstance(appGUID string, instance int) error { 81 err := repo.gateway.DeleteResource(repo.config.APIEndpoint(), fmt.Sprintf("/v2/apps/%s/instances/%d", appGUID, instance)) 82 if err != nil { 83 return err 84 } 85 return nil 86 } 87 88 func (repo CloudControllerAppInstancesRepository) updateInstancesWithStats(guid string, instances []models.AppInstanceFields) (updatedInst []models.AppInstanceFields, apiErr error) { 89 path := fmt.Sprintf("%s/v2/apps/%s/stats", repo.config.APIEndpoint(), guid) 90 statsResponse := StatsAPIResponse{} 91 apiErr = repo.gateway.GetResource(path, &statsResponse) 92 if apiErr != nil { 93 return 94 } 95 96 updatedInst = make([]models.AppInstanceFields, len(statsResponse), len(statsResponse)) 97 for k, v := range statsResponse { 98 index, err := strconv.Atoi(k) 99 if err != nil { 100 continue 101 } 102 103 instance := instances[index] 104 instance.CPUUsage = v.Stats.Usage.CPU 105 instance.DiskQuota = v.Stats.DiskQuota 106 instance.DiskUsage = v.Stats.Usage.Disk 107 instance.MemQuota = v.Stats.MemQuota 108 instance.MemUsage = v.Stats.Usage.Mem 109 110 updatedInst[index] = instance 111 } 112 return 113 }