github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/caasunitprovisioner/mock_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasunitprovisioner_test 5 6 import ( 7 "sync" 8 "time" 9 10 "github.com/juju/testing" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/api/base" 14 apicaasunitprovisioner "github.com/juju/juju/api/caasunitprovisioner" 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/caas" 17 "github.com/juju/juju/core/application" 18 "github.com/juju/juju/core/life" 19 "github.com/juju/juju/core/status" 20 "github.com/juju/juju/core/watcher" 21 "github.com/juju/juju/core/watcher/watchertest" 22 "github.com/juju/juju/network" 23 coretesting "github.com/juju/juju/testing" 24 "github.com/juju/juju/worker/caasunitprovisioner" 25 ) 26 27 type fakeAPICaller struct { 28 base.APICaller 29 } 30 31 type fakeBroker struct { 32 caas.Broker 33 } 34 35 type fakeClient struct { 36 caasunitprovisioner.Client 37 } 38 39 type mockServiceBroker struct { 40 testing.Stub 41 caas.ContainerEnvironProvider 42 ensured chan<- struct{} 43 deleted chan<- struct{} 44 podSpec *caas.PodSpec 45 } 46 47 func (m *mockServiceBroker) Provider() caas.ContainerEnvironProvider { 48 return m 49 } 50 51 func (m *mockServiceBroker) ParsePodSpec(in string) (*caas.PodSpec, error) { 52 return m.podSpec, nil 53 } 54 55 func (m *mockServiceBroker) EnsureService(appName string, statusCallback caas.StatusCallbackFunc, params *caas.ServiceParams, numUnits int, config application.ConfigAttributes) error { 56 m.MethodCall(m, "EnsureService", appName, params, numUnits, config) 57 statusCallback(appName, status.Waiting, "ensuring", map[string]interface{}{"foo": "bar"}) 58 m.ensured <- struct{}{} 59 return m.NextErr() 60 } 61 62 func (m *mockServiceBroker) EnsureCustomResourceDefinition(appName string, podSpec *caas.PodSpec) error { 63 m.MethodCall(m, "EnsureCustomResourceDefinition", appName, podSpec) 64 return m.NextErr() 65 } 66 67 func (m *mockServiceBroker) Service(appName string) (*caas.Service, error) { 68 m.MethodCall(m, "Service", appName) 69 return &caas.Service{Id: "id", Addresses: []network.Address{{Value: "10.0.0.1"}}}, m.NextErr() 70 } 71 72 func (m *mockServiceBroker) DeleteService(appName string) error { 73 m.MethodCall(m, "DeleteService", appName) 74 m.deleted <- struct{}{} 75 return m.NextErr() 76 } 77 78 func (m *mockServiceBroker) UnexposeService(appName string) error { 79 m.MethodCall(m, "UnexposeService", appName) 80 return m.NextErr() 81 } 82 83 type mockContainerBroker struct { 84 testing.Stub 85 caas.ContainerEnvironProvider 86 unitsWatcher *watchertest.MockNotifyWatcher 87 operatorWatcher *watchertest.MockNotifyWatcher 88 reportedUnitStatus status.Status 89 reportedOperatorStatus status.Status 90 podSpec *caas.PodSpec 91 } 92 93 func (m *mockContainerBroker) Provider() caas.ContainerEnvironProvider { 94 return m 95 } 96 97 func (m *mockContainerBroker) ParsePodSpec(in string) (*caas.PodSpec, error) { 98 return m.podSpec, nil 99 } 100 101 func (m *mockContainerBroker) WatchUnits(appName string) (watcher.NotifyWatcher, error) { 102 m.MethodCall(m, "WatchUnits", appName) 103 return m.unitsWatcher, m.NextErr() 104 } 105 106 func (m *mockContainerBroker) Units(appName string) ([]caas.Unit, error) { 107 m.MethodCall(m, "Units", appName) 108 return []caas.Unit{ 109 { 110 Id: "u1", 111 Address: "10.0.0.1", 112 Status: status.StatusInfo{Status: m.reportedUnitStatus}, 113 FilesystemInfo: []caas.FilesystemInfo{ 114 {MountPoint: "/path-to-here", ReadOnly: true, StorageName: "database", 115 Size: 100, FilesystemId: "fs-id", 116 Status: status.StatusInfo{Status: status.Attaching, Message: "not ready"}, 117 Volume: caas.VolumeInfo{VolumeId: "vol-id", Size: 200, Persistent: true, 118 Status: status.StatusInfo{Status: status.Error, Message: "vol not ready"}}, 119 }, 120 }, 121 }, 122 }, 123 m.NextErr() 124 } 125 126 func (m *mockContainerBroker) Operator(appName string) (*caas.Operator, error) { 127 m.MethodCall(m, "Operator", appName) 128 return &caas.Operator{ 129 Dying: false, 130 Status: status.StatusInfo{ 131 Status: m.reportedOperatorStatus, 132 Message: "testing 1. 2. 3.", 133 Data: map[string]interface{}{"zip": "zap"}, 134 }, 135 }, nil 136 } 137 138 func (m *mockContainerBroker) WatchOperator(appName string) (watcher.NotifyWatcher, error) { 139 m.MethodCall(m, "WatchOperator", appName) 140 return m.operatorWatcher, m.NextErr() 141 } 142 143 type mockApplicationGetter struct { 144 testing.Stub 145 watcher *watchertest.MockStringsWatcher 146 scaleWatcher *watchertest.MockNotifyWatcher 147 scale int 148 } 149 150 func (m *mockApplicationGetter) WatchApplications() (watcher.StringsWatcher, error) { 151 m.MethodCall(m, "WatchApplications") 152 if err := m.NextErr(); err != nil { 153 return nil, err 154 } 155 return m.watcher, nil 156 } 157 158 func (a *mockApplicationGetter) ApplicationConfig(appName string) (application.ConfigAttributes, error) { 159 a.MethodCall(a, "ApplicationConfig", appName) 160 return application.ConfigAttributes{ 161 "juju-external-hostname": "exthost", 162 }, a.NextErr() 163 } 164 165 func (a *mockApplicationGetter) WatchApplicationScale(application string) (watcher.NotifyWatcher, error) { 166 a.MethodCall(a, "WatchApplicationScale", application) 167 if err := a.NextErr(); err != nil { 168 return nil, err 169 } 170 return a.scaleWatcher, nil 171 } 172 173 func (a *mockApplicationGetter) ApplicationScale(application string) (int, error) { 174 a.MethodCall(a, "ApplicationScale", application) 175 if err := a.NextErr(); err != nil { 176 return 0, err 177 } 178 return a.scale, nil 179 } 180 181 type mockApplicationUpdater struct { 182 testing.Stub 183 updated chan<- struct{} 184 } 185 186 func (m *mockApplicationUpdater) UpdateApplicationService(arg params.UpdateApplicationServiceArg) error { 187 m.MethodCall(m, "UpdateApplicationService", arg) 188 m.updated <- struct{}{} 189 return m.NextErr() 190 } 191 192 type mockProvisioningInfoGetterGetter struct { 193 testing.Stub 194 provisioningInfo apicaasunitprovisioner.ProvisioningInfo 195 watcher *watchertest.MockNotifyWatcher 196 specRetrieved chan struct{} 197 } 198 199 func (m *mockProvisioningInfoGetterGetter) setProvisioningInfo(provisioningInfo apicaasunitprovisioner.ProvisioningInfo) { 200 m.provisioningInfo = provisioningInfo 201 m.specRetrieved = make(chan struct{}, 2) 202 } 203 204 func (m *mockProvisioningInfoGetterGetter) assertSpecRetrieved(c *gc.C) { 205 select { 206 case <-m.specRetrieved: 207 case <-time.After(coretesting.LongWait): 208 c.Fatal("timed out waiting for pod spec to be retrieved") 209 } 210 } 211 212 func (m *mockProvisioningInfoGetterGetter) ProvisioningInfo(appName string) (*apicaasunitprovisioner.ProvisioningInfo, error) { 213 m.MethodCall(m, "ProvisioningInfo", appName) 214 if err := m.NextErr(); err != nil { 215 return nil, err 216 } 217 provisioningInfo := m.provisioningInfo 218 select { 219 case m.specRetrieved <- struct{}{}: 220 default: 221 } 222 return &provisioningInfo, nil 223 } 224 225 func (m *mockProvisioningInfoGetterGetter) WatchPodSpec(appName string) (watcher.NotifyWatcher, error) { 226 m.MethodCall(m, "WatchPodSpec", appName) 227 if err := m.NextErr(); err != nil { 228 return nil, err 229 } 230 return m.watcher, nil 231 } 232 233 type mockLifeGetter struct { 234 testing.Stub 235 mu sync.Mutex 236 life life.Value 237 lifeRetrieved chan struct{} 238 } 239 240 func (m *mockLifeGetter) setLife(life life.Value) { 241 m.mu.Lock() 242 defer m.mu.Unlock() 243 m.life = life 244 m.lifeRetrieved = make(chan struct{}, 1) 245 } 246 247 func (m *mockLifeGetter) assertLifeRetrieved(c *gc.C) { 248 select { 249 case <-m.lifeRetrieved: 250 case <-time.After(coretesting.LongWait): 251 c.Fatal("timed out waiting for life to be retrieved") 252 } 253 } 254 255 func (m *mockLifeGetter) Life(entityName string) (life.Value, error) { 256 m.mu.Lock() 257 defer m.mu.Unlock() 258 m.MethodCall(m, "Life", entityName) 259 if err := m.NextErr(); err != nil { 260 return "", err 261 } 262 life := m.life 263 select { 264 case m.lifeRetrieved <- struct{}{}: 265 default: 266 } 267 return life, nil 268 } 269 270 type mockUnitUpdater struct { 271 testing.Stub 272 } 273 274 func (m *mockUnitUpdater) UpdateUnits(arg params.UpdateApplicationUnits) error { 275 m.MethodCall(m, "UpdateUnits", arg) 276 if err := m.NextErr(); err != nil { 277 return err 278 } 279 return nil 280 } 281 282 type mockProvisioningStatusSetter struct { 283 testing.Stub 284 } 285 286 func (m *mockProvisioningStatusSetter) SetOperatorStatus(appName string, status status.Status, message string, data map[string]interface{}) error { 287 m.MethodCall(m, "SetOperatorStatus", appName, status, message, data) 288 if err := m.NextErr(); err != nil { 289 return err 290 } 291 return nil 292 }