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  }