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 }