github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/actor/v2action/application_summary_test.go (about) 1 package v2action_test 2 3 import ( 4 "errors" 5 6 "code.cloudfoundry.org/cli/actor/actionerror" 7 . "code.cloudfoundry.org/cli/actor/v2action" 8 "code.cloudfoundry.org/cli/actor/v2action/v2actionfakes" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("Application Summary Actions", func() { 17 Describe("ApplicationSummary", func() { 18 Describe("StartingOrRunningInstanceCount", func() { 19 It("only counts the running and starting instances", func() { 20 app := ApplicationSummary{ 21 RunningInstances: []ApplicationInstanceWithStats{ 22 {State: ApplicationInstanceState(constant.ApplicationInstanceCrashed)}, 23 {State: ApplicationInstanceState(constant.ApplicationInstanceDown)}, 24 {State: ApplicationInstanceState(constant.ApplicationInstanceFlapping)}, 25 {State: ApplicationInstanceState(constant.ApplicationInstanceRunning)}, 26 {State: ApplicationInstanceState(constant.ApplicationInstanceStarting)}, 27 {State: ApplicationInstanceState(constant.ApplicationInstanceUnknown)}, 28 }, 29 } 30 Expect(app.StartingOrRunningInstanceCount()).To(Equal(2)) 31 }) 32 }) 33 }) 34 35 Describe("GetApplicationSummaryByNameSpace", func() { 36 var ( 37 actor *Actor 38 fakeCloudControllerClient *v2actionfakes.FakeCloudControllerClient 39 ccApp ccv2.Application 40 ) 41 42 BeforeEach(func() { 43 fakeCloudControllerClient = new(v2actionfakes.FakeCloudControllerClient) 44 actor = NewActor(fakeCloudControllerClient, nil, nil) 45 ccApp = ccv2.Application{ 46 GUID: "some-app-guid", 47 Name: "some-app", 48 } 49 }) 50 51 When("the application does not exist", func() { 52 BeforeEach(func() { 53 fakeCloudControllerClient.GetApplicationsReturns( 54 []ccv2.Application{}, 55 ccv2.Warnings{"app-warning"}, 56 nil) 57 }) 58 59 It("returns an ApplicationNotFoundError and all warnings", func() { 60 _, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 61 Expect(err).To(MatchError(actionerror.ApplicationNotFoundError{Name: "some-app"})) 62 Expect(warnings).To(ConsistOf("app-warning")) 63 }) 64 }) 65 66 When("the application exists", func() { 67 BeforeEach(func() { 68 fakeCloudControllerClient.GetApplicationsReturns( 69 []ccv2.Application{ccApp}, 70 ccv2.Warnings{"app-warning"}, 71 nil) 72 }) 73 74 When("the application is STARTED", func() { 75 BeforeEach(func() { 76 ccApp.State = constant.ApplicationStarted 77 fakeCloudControllerClient.GetApplicationsReturns( 78 []ccv2.Application{ccApp}, 79 ccv2.Warnings{"app-warning"}, 80 nil) 81 }) 82 83 When("instance information is available", func() { 84 BeforeEach(func() { 85 fakeCloudControllerClient.GetApplicationApplicationInstanceStatusesReturns( 86 map[int]ccv2.ApplicationInstanceStatus{ 87 0: {ID: 0, IsolationSegment: "isolation-segment-1"}, 88 1: {ID: 1, IsolationSegment: "isolation-segment-2"}, // should never happen; iso segs for 2 instances of the same app should match. 89 }, 90 ccv2.Warnings{"stats-warning"}, 91 nil) 92 fakeCloudControllerClient.GetApplicationApplicationInstancesReturns( 93 map[int]ccv2.ApplicationInstance{ 94 0: {ID: 0}, 95 1: {ID: 1}, 96 }, 97 ccv2.Warnings{"instance-warning"}, 98 nil) 99 }) 100 101 It("returns the application with instance information and warnings and populates isolation segment from the first instance", func() { 102 app, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 103 Expect(err).ToNot(HaveOccurred()) 104 Expect(app).To(Equal(ApplicationSummary{ 105 Application: Application{ 106 GUID: "some-app-guid", 107 Name: "some-app", 108 State: constant.ApplicationStarted, 109 }, 110 RunningInstances: []ApplicationInstanceWithStats{ 111 {ID: 0, IsolationSegment: "isolation-segment-1"}, 112 {ID: 1, IsolationSegment: "isolation-segment-2"}, 113 }, 114 IsolationSegment: "isolation-segment-1", 115 })) 116 Expect(warnings).To(ConsistOf("app-warning", "stats-warning", "instance-warning")) 117 }) 118 }) 119 120 When("instance information is not available", func() { 121 BeforeEach(func() { 122 fakeCloudControllerClient.GetApplicationApplicationInstanceStatusesReturns( 123 nil, 124 ccv2.Warnings{"stats-warning"}, 125 ccerror.ApplicationStoppedStatsError{}) 126 }) 127 128 It("returns the empty list of instances and all warnings", func() { 129 app, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 130 Expect(err).ToNot(HaveOccurred()) 131 Expect(app.RunningInstances).To(BeEmpty()) 132 Expect(warnings).To(ConsistOf("app-warning", "stats-warning")) 133 }) 134 }) 135 }) 136 137 When("the application is not STARTED", func() { 138 BeforeEach(func() { 139 ccApp.State = constant.ApplicationStopped 140 }) 141 142 It("does not try and get application instance information", func() { 143 app, _, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 144 Expect(err).ToNot(HaveOccurred()) 145 Expect(app.RunningInstances).To(BeEmpty()) 146 147 Expect(fakeCloudControllerClient.GetApplicationApplicationInstanceStatusesCallCount()).To(Equal(0)) 148 Expect(fakeCloudControllerClient.GetApplicationApplicationInstancesCallCount()).To(Equal(0)) 149 }) 150 }) 151 152 When("the app has routes", func() { 153 BeforeEach(func() { 154 fakeCloudControllerClient.GetApplicationRoutesReturns( 155 []ccv2.Route{ 156 { 157 GUID: "some-route-1-guid", 158 Host: "host-1", 159 }, 160 { 161 GUID: "some-route-2-guid", 162 Host: "host-2", 163 }, 164 }, 165 ccv2.Warnings{"get-application-routes-warning"}, 166 nil) 167 }) 168 169 It("returns the routes and all warnings", func() { 170 app, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 171 Expect(err).ToNot(HaveOccurred()) 172 Expect(warnings).To(ConsistOf("app-warning", "get-application-routes-warning")) 173 Expect(app.Routes).To(ConsistOf( 174 Route{ 175 GUID: "some-route-1-guid", 176 Host: "host-1", 177 }, 178 Route{ 179 GUID: "some-route-2-guid", 180 Host: "host-2", 181 }, 182 )) 183 }) 184 185 When("an error is encountered while getting routes", func() { 186 var expectedErr error 187 188 BeforeEach(func() { 189 expectedErr = errors.New("get routes error") 190 fakeCloudControllerClient.GetApplicationRoutesReturns( 191 nil, 192 ccv2.Warnings{"get-application-routes-warning"}, 193 expectedErr, 194 ) 195 }) 196 197 It("returns the error and all warnings", func() { 198 app, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 199 Expect(err).To(MatchError(expectedErr)) 200 Expect(app.Routes).To(BeEmpty()) 201 Expect(warnings).To(ConsistOf("app-warning", "get-application-routes-warning")) 202 }) 203 }) 204 }) 205 206 When("the app has stack information", func() { 207 BeforeEach(func() { 208 fakeCloudControllerClient.GetStackReturns( 209 ccv2.Stack{Name: "some-stack"}, 210 ccv2.Warnings{"get-application-stack-warning"}, 211 nil) 212 }) 213 214 It("returns the stack information and all warnings", func() { 215 app, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 216 Expect(err).ToNot(HaveOccurred()) 217 Expect(warnings).To(ConsistOf("app-warning", "get-application-stack-warning")) 218 Expect(app.Stack).To(Equal(Stack{Name: "some-stack"})) 219 }) 220 221 When("an error is encountered while getting stack", func() { 222 var expectedErr error 223 224 BeforeEach(func() { 225 expectedErr = errors.New("get stack error") 226 fakeCloudControllerClient.GetStackReturns( 227 ccv2.Stack{}, 228 ccv2.Warnings{"get-application-stack-warning"}, 229 expectedErr, 230 ) 231 }) 232 233 It("returns the error and all warnings", func() { 234 app, warnings, err := actor.GetApplicationSummaryByNameAndSpace("some-app", "some-space-guid") 235 Expect(err).To(MatchError(expectedErr)) 236 Expect(app.Stack).To(Equal(Stack{})) 237 Expect(warnings).To(ConsistOf("app-warning", "get-application-stack-warning")) 238 }) 239 }) 240 }) 241 }) 242 }) 243 })