github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/caas/kubernetes/provider/base_test.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package provider_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/golang/mock/gomock"
    10  	jujuclock "github.com/juju/clock"
    11  	testclock "github.com/juju/clock/testclock"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	apiextensionsclientset "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
    15  	k8serrors "k8s.io/apimachinery/pkg/api/errors"
    16  	"k8s.io/apimachinery/pkg/apis/meta/v1"
    17  	"k8s.io/apimachinery/pkg/runtime/schema"
    18  	watch "k8s.io/apimachinery/pkg/watch"
    19  	"k8s.io/client-go/kubernetes"
    20  	"k8s.io/client-go/rest"
    21  
    22  	"github.com/juju/juju/caas"
    23  	"github.com/juju/juju/caas/kubernetes/provider"
    24  	"github.com/juju/juju/caas/kubernetes/provider/mocks"
    25  	"github.com/juju/juju/cloud"
    26  	"github.com/juju/juju/environs"
    27  	"github.com/juju/juju/environs/config"
    28  	"github.com/juju/juju/testing"
    29  )
    30  
    31  type BaseSuite struct {
    32  	testing.BaseSuite
    33  
    34  	clock         *testclock.Clock
    35  	broker        caas.Broker
    36  	cfg           *config.Config
    37  	k8sRestConfig *rest.Config
    38  
    39  	k8sClient                  *mocks.MockInterface
    40  	mockNamespaces             *mocks.MockNamespaceInterface
    41  	mockApps                   *mocks.MockAppsV1Interface
    42  	mockExtensions             *mocks.MockExtensionsV1beta1Interface
    43  	mockSecrets                *mocks.MockSecretInterface
    44  	mockDeployments            *mocks.MockDeploymentInterface
    45  	mockStatefulSets           *mocks.MockStatefulSetInterface
    46  	mockPods                   *mocks.MockPodInterface
    47  	mockServices               *mocks.MockServiceInterface
    48  	mockConfigMaps             *mocks.MockConfigMapInterface
    49  	mockPersistentVolumes      *mocks.MockPersistentVolumeInterface
    50  	mockPersistentVolumeClaims *mocks.MockPersistentVolumeClaimInterface
    51  	mockStorage                *mocks.MockStorageV1Interface
    52  	mockStorageClass           *mocks.MockStorageClassInterface
    53  	mockIngressInterface       *mocks.MockIngressInterface
    54  	mockNodes                  *mocks.MockNodeInterface
    55  
    56  	mockApiextensionsV1          *mocks.MockApiextensionsV1beta1Interface
    57  	mockApiextensionsClient      *mocks.MockApiExtensionsClientInterface
    58  	mockCustomResourceDefinition *mocks.MockCustomResourceDefinitionInterface
    59  
    60  	watcher *provider.KubernetesWatcher
    61  }
    62  
    63  const testNamespace = "test"
    64  
    65  func (s *BaseSuite) SetUpSuite(c *gc.C) {
    66  	s.BaseSuite.SetUpSuite(c)
    67  
    68  	cred := cloud.NewCredential(cloud.UserPassAuthType, map[string]string{
    69  		"username":              "fred",
    70  		"password":              "secret",
    71  		"ClientCertificateData": "cert-data",
    72  		"ClientKeyData":         "cert-key",
    73  	})
    74  	cloudSpec := environs.CloudSpec{
    75  		Endpoint:       "some-host",
    76  		Credential:     &cred,
    77  		CACertificates: []string{testing.CACert},
    78  	}
    79  	var err error
    80  	s.k8sRestConfig, err = provider.CloudSpecToK8sRestConfig(cloudSpec)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  }
    83  
    84  func (s *BaseSuite) setupBroker(c *gc.C) *gomock.Controller {
    85  	cfg, err := config.New(config.UseDefaults, testing.FakeConfig().Merge(testing.Attrs{
    86  		config.NameKey: testNamespace,
    87  	}))
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	s.cfg = cfg
    90  
    91  	ctrl := gomock.NewController(c)
    92  	s.k8sClient = mocks.NewMockInterface(ctrl)
    93  
    94  	// Plug in the various k8s client modules we need.
    95  	// eg namespaces, pods, services, ingress resources, volumes etc.
    96  	// We make the mock and assign it to the corresponding core getter function.
    97  	mockCoreV1 := mocks.NewMockCoreV1Interface(ctrl)
    98  	s.k8sClient.EXPECT().CoreV1().AnyTimes().Return(mockCoreV1)
    99  
   100  	s.mockNamespaces = mocks.NewMockNamespaceInterface(ctrl)
   101  	mockCoreV1.EXPECT().Namespaces().AnyTimes().Return(s.mockNamespaces)
   102  
   103  	s.mockPods = mocks.NewMockPodInterface(ctrl)
   104  	mockCoreV1.EXPECT().Pods(testNamespace).AnyTimes().Return(s.mockPods)
   105  
   106  	s.mockServices = mocks.NewMockServiceInterface(ctrl)
   107  	mockCoreV1.EXPECT().Services(testNamespace).AnyTimes().Return(s.mockServices)
   108  
   109  	s.mockConfigMaps = mocks.NewMockConfigMapInterface(ctrl)
   110  	mockCoreV1.EXPECT().ConfigMaps(testNamespace).AnyTimes().Return(s.mockConfigMaps)
   111  
   112  	s.mockPersistentVolumes = mocks.NewMockPersistentVolumeInterface(ctrl)
   113  	mockCoreV1.EXPECT().PersistentVolumes().AnyTimes().Return(s.mockPersistentVolumes)
   114  
   115  	s.mockPersistentVolumeClaims = mocks.NewMockPersistentVolumeClaimInterface(ctrl)
   116  	mockCoreV1.EXPECT().PersistentVolumeClaims(testNamespace).AnyTimes().Return(s.mockPersistentVolumeClaims)
   117  
   118  	s.mockSecrets = mocks.NewMockSecretInterface(ctrl)
   119  	mockCoreV1.EXPECT().Secrets(testNamespace).AnyTimes().Return(s.mockSecrets)
   120  
   121  	s.mockNodes = mocks.NewMockNodeInterface(ctrl)
   122  	mockCoreV1.EXPECT().Nodes().AnyTimes().Return(s.mockNodes)
   123  
   124  	s.mockApps = mocks.NewMockAppsV1Interface(ctrl)
   125  	s.mockExtensions = mocks.NewMockExtensionsV1beta1Interface(ctrl)
   126  	s.mockStatefulSets = mocks.NewMockStatefulSetInterface(ctrl)
   127  	s.mockDeployments = mocks.NewMockDeploymentInterface(ctrl)
   128  	s.mockIngressInterface = mocks.NewMockIngressInterface(ctrl)
   129  	s.k8sClient.EXPECT().ExtensionsV1beta1().AnyTimes().Return(s.mockExtensions)
   130  	s.k8sClient.EXPECT().AppsV1().AnyTimes().Return(s.mockApps)
   131  	s.mockApps.EXPECT().StatefulSets(testNamespace).AnyTimes().Return(s.mockStatefulSets)
   132  	s.mockApps.EXPECT().Deployments(testNamespace).AnyTimes().Return(s.mockDeployments)
   133  	s.mockExtensions.EXPECT().Ingresses(testNamespace).AnyTimes().Return(s.mockIngressInterface)
   134  
   135  	s.mockStorage = mocks.NewMockStorageV1Interface(ctrl)
   136  	s.mockStorageClass = mocks.NewMockStorageClassInterface(ctrl)
   137  	s.k8sClient.EXPECT().StorageV1().AnyTimes().Return(s.mockStorage)
   138  	s.mockStorage.EXPECT().StorageClasses().AnyTimes().Return(s.mockStorageClass)
   139  
   140  	s.mockApiextensionsClient = mocks.NewMockApiExtensionsClientInterface(ctrl)
   141  	s.mockApiextensionsV1 = mocks.NewMockApiextensionsV1beta1Interface(ctrl)
   142  	s.mockCustomResourceDefinition = mocks.NewMockCustomResourceDefinitionInterface(ctrl)
   143  	s.mockApiextensionsClient.EXPECT().ApiextensionsV1beta1().AnyTimes().Return(s.mockApiextensionsV1)
   144  	s.mockApiextensionsV1.EXPECT().CustomResourceDefinitions().AnyTimes().Return(s.mockCustomResourceDefinition)
   145  
   146  	// Set up the mock k8sClient we pass to our broker under test.
   147  	newClient := func(cfg *rest.Config) (kubernetes.Interface, apiextensionsclientset.Interface, error) {
   148  		c.Assert(cfg.Username, gc.Equals, "fred")
   149  		c.Assert(cfg.Password, gc.Equals, "secret")
   150  		c.Assert(cfg.Host, gc.Equals, "some-host")
   151  		c.Assert(cfg.TLSClientConfig, jc.DeepEquals, rest.TLSClientConfig{
   152  			CertData: []byte("cert-data"),
   153  			KeyData:  []byte("cert-key"),
   154  			CAData:   []byte(testing.CACert),
   155  		})
   156  		return s.k8sClient, s.mockApiextensionsClient, nil
   157  	}
   158  
   159  	s.clock = testclock.NewClock(time.Time{})
   160  	newK8sWatcherForTest := func(wi watch.Interface, name string, clock jujuclock.Clock) (*provider.KubernetesWatcher, error) {
   161  		w, err := provider.NewKubernetesWatcher(wi, name, clock)
   162  		c.Assert(err, jc.ErrorIsNil)
   163  		s.watcher = w
   164  		return s.watcher, err
   165  	}
   166  	s.broker, err = provider.NewK8sBroker(s.k8sRestConfig, cfg, newClient, newK8sWatcherForTest, s.clock)
   167  	c.Assert(err, jc.ErrorIsNil)
   168  	return ctrl
   169  }
   170  
   171  func (s *BaseSuite) k8sNotFoundError() *k8serrors.StatusError {
   172  	return k8serrors.NewNotFound(schema.GroupResource{}, "test")
   173  }
   174  
   175  func (s *BaseSuite) k8sAlreadyExistsError() *k8serrors.StatusError {
   176  	return k8serrors.NewAlreadyExists(schema.GroupResource{}, "test")
   177  }
   178  
   179  func (s *BaseSuite) deleteOptions(policy v1.DeletionPropagation) *v1.DeleteOptions {
   180  	return &v1.DeleteOptions{PropagationPolicy: &policy}
   181  }
   182  
   183  func (s *BaseSuite) k8sNewFakeWatcher() *watch.RaceFreeFakeWatcher {
   184  	return watch.NewRaceFreeFake()
   185  }