Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unit test install strategy ALM-227 #132

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 5 additions & 4 deletions Makefile
Expand Up @@ -65,9 +65,10 @@ $(MOCKGEN):
go get github.com/golang/mock/mockgen

generate-mock-client: $(MOCKGEN)
@$(MOCKGEN) -package=client -source=client/clusterserviceversion_client.go > client/zz_generated.mock_clusterserviceversion_client.go
@$(MOCKGEN) -package=client -source=client/installplan_client.go > client/zz_generated.mock_installplan_client.go
@$(MOCKGEN) -package=client -source=client/alphacatalogentry_client.go > client/zz_generated.mock_alphacatalogentry_client.go
@$(MOCKGEN) -package=install -source=install/resolver.go > install/zz_generated.mock_resolver.go
mockgen -package=client -source=client/clusterserviceversion_client.go > client/zz_generated.mock_clusterserviceversion_client.go
mockgen -package=client -source=client/installplan_client.go > client/zz_generated.mock_installplan_client.go
mockgen -package=client -source=client/alphacatalogentry_client.go > client/zz_generated.mock_alphacatalogentry_client.go
mockgen -package=client -source=client/deployment_install_client.go > client/zz_generated.mock_deployment_install_client.go
mockgen -package=install -source=install/resolver.go > install/zz_generated.mock_resolver.go

make gen-all: gen-ci codegen generate-mock-client
1 change: 1 addition & 0 deletions apis/clusterserviceversion/v1alpha1/types.go
Expand Up @@ -130,6 +130,7 @@ const (
CSVReasonRequirementsNotMet ConditionReason = "RequirementsNotMet"
CSVReasonRequirementsMet ConditionReason = "AllRequirementsMet"
CSVReasonComponentFailed ConditionReason = "InstallComponentFailed"
CSVReasonInvalidStrategy ConditionReason = "InvalidInstallStrategy"
CSVReasonInstallSuccessful ConditionReason = "InstallSucceeded"
CSVReasonInstallCheckFailed ConditionReason = "InstallCheckFailed"
CSVReasonComponentUnhealthy ConditionReason = "ComponentUnhealthy"
Expand Down
2 changes: 0 additions & 2 deletions apis/subscription/v1alpha1/doc.go

This file was deleted.

47 changes: 0 additions & 47 deletions apis/subscription/v1alpha1/types.go

This file was deleted.

144 changes: 0 additions & 144 deletions apis/subscription/v1alpha1/zz_generated.deepcopy.go

This file was deleted.

76 changes: 76 additions & 0 deletions client/deployment_install_client.go
@@ -0,0 +1,76 @@
package client

import (
opClient "github.com/coreos-inc/operator-client/pkg/client"
"github.com/pkg/errors"
"k8s.io/api/core/v1"
v1beta1extensions "k8s.io/api/extensions/v1beta1"
v1beta1rbac "k8s.io/api/rbac/v1beta1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type InstallStrategyDeploymentInterface interface {
CreateRole(role *v1beta1rbac.Role) (*v1beta1rbac.Role, error)
CreateRoleBinding(roleBinding *v1beta1rbac.RoleBinding) (*v1beta1rbac.RoleBinding, error)
EnsureServiceAccount(serviceAccount *v1.ServiceAccount) (*v1.ServiceAccount, error)
CreateDeployment(deployment *v1beta1extensions.Deployment) (*v1beta1extensions.Deployment, error)
GetServiceAccountByName(serviceAccountName string) (*v1.ServiceAccount, error)
GetOwnedDeployments(owner metav1.ObjectMeta) (*v1beta1extensions.DeploymentList, error)
}

type InstallStrategyDeploymentClientForNamespace struct {
opClient opClient.Interface
Namespace string
}

var _ InstallStrategyDeploymentInterface = &InstallStrategyDeploymentClientForNamespace{}

func NewInstallStrategyDeploymentClient(opClient opClient.Interface, namespace string) InstallStrategyDeploymentInterface {
return &InstallStrategyDeploymentClientForNamespace{
opClient: opClient,
Namespace: namespace,
}
}

func (c *InstallStrategyDeploymentClientForNamespace) CreateRole(role *v1beta1rbac.Role) (*v1beta1rbac.Role, error) {
return c.opClient.KubernetesInterface().RbacV1beta1().Roles(c.Namespace).Create(role)
}

func (c *InstallStrategyDeploymentClientForNamespace) CreateRoleBinding(roleBinding *v1beta1rbac.RoleBinding) (*v1beta1rbac.RoleBinding, error) {
return c.opClient.KubernetesInterface().RbacV1beta1().RoleBindings(c.Namespace).Create(roleBinding)
}

func (c *InstallStrategyDeploymentClientForNamespace) EnsureServiceAccount(serviceAccount *v1.ServiceAccount) (*v1.ServiceAccount, error) {
foundAccount, err := c.opClient.KubernetesInterface().CoreV1().ServiceAccounts(c.Namespace).Get(serviceAccount.Name, metav1.GetOptions{})
if err == nil {
return foundAccount, nil
}
if !apierrors.IsNotFound(err) {
return nil, errors.Wrap(err, "checking for existing serviceacccount failed")
}

createdAccount, err := c.opClient.KubernetesInterface().CoreV1().ServiceAccounts(c.Namespace).Create(serviceAccount)
if err != nil && !apierrors.IsAlreadyExists(err) {
return nil, errors.Wrap(err, "creating serviceacccount failed")
}
if apierrors.IsAlreadyExists(err) {
return serviceAccount, nil
}
return createdAccount, nil
}

func (c *InstallStrategyDeploymentClientForNamespace) CreateDeployment(deployment *v1beta1extensions.Deployment) (*v1beta1extensions.Deployment, error) {
return c.opClient.CreateDeployment(deployment)
}

func (c *InstallStrategyDeploymentClientForNamespace) GetServiceAccountByName(serviceAccountName string) (*v1.ServiceAccount, error) {
return c.opClient.KubernetesInterface().CoreV1().ServiceAccounts(c.Namespace).Get(serviceAccountName, metav1.GetOptions{})
}

func (c *InstallStrategyDeploymentClientForNamespace) GetOwnedDeployments(owner metav1.ObjectMeta) (*v1beta1extensions.DeploymentList, error) {
return c.opClient.ListDeploymentsWithLabels(c.Namespace, map[string]string{
"alm-owner-name": owner.Name,
"alm-owner-namespace": owner.Namespace,
})
}
40 changes: 16 additions & 24 deletions client/zz_generated.mock_clusterserviceversion_client.go
@@ -1,59 +1,51 @@
// Code generated by MockGen. DO NOT EDIT.
// Automatically generated by MockGen. DO NOT EDIT!
// Source: client/clusterserviceversion_client.go

// Package client is a generated GoMock package.
package client

import (
v1alpha1 "github.com/coreos-inc/alm/apis/clusterserviceversion/v1alpha1"
gomock "github.com/golang/mock/gomock"
reflect "reflect"
)

// MockClusterServiceVersionInterface is a mock of ClusterServiceVersionInterface interface
// Mock of ClusterServiceVersionInterface interface
type MockClusterServiceVersionInterface struct {
ctrl *gomock.Controller
recorder *MockClusterServiceVersionInterfaceMockRecorder
recorder *_MockClusterServiceVersionInterfaceRecorder
}

// MockClusterServiceVersionInterfaceMockRecorder is the mock recorder for MockClusterServiceVersionInterface
type MockClusterServiceVersionInterfaceMockRecorder struct {
// Recorder for MockClusterServiceVersionInterface (not exported)
type _MockClusterServiceVersionInterfaceRecorder struct {
mock *MockClusterServiceVersionInterface
}

// NewMockClusterServiceVersionInterface creates a new mock instance
func NewMockClusterServiceVersionInterface(ctrl *gomock.Controller) *MockClusterServiceVersionInterface {
mock := &MockClusterServiceVersionInterface{ctrl: ctrl}
mock.recorder = &MockClusterServiceVersionInterfaceMockRecorder{mock}
mock.recorder = &_MockClusterServiceVersionInterfaceRecorder{mock}
return mock
}

// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockClusterServiceVersionInterface) EXPECT() *MockClusterServiceVersionInterfaceMockRecorder {
return m.recorder
func (_m *MockClusterServiceVersionInterface) EXPECT() *_MockClusterServiceVersionInterfaceRecorder {
return _m.recorder
}

// UpdateCSV mocks base method
func (m *MockClusterServiceVersionInterface) UpdateCSV(csv *v1alpha1.ClusterServiceVersion) (*v1alpha1.ClusterServiceVersion, error) {
ret := m.ctrl.Call(m, "UpdateCSV", csv)
func (_m *MockClusterServiceVersionInterface) UpdateCSV(csv *v1alpha1.ClusterServiceVersion) (*v1alpha1.ClusterServiceVersion, error) {
ret := _m.ctrl.Call(_m, "UpdateCSV", csv)
ret0, _ := ret[0].(*v1alpha1.ClusterServiceVersion)
ret1, _ := ret[1].(error)
return ret0, ret1
}

// UpdateCSV indicates an expected call of UpdateCSV
func (mr *MockClusterServiceVersionInterfaceMockRecorder) UpdateCSV(csv interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateCSV", reflect.TypeOf((*MockClusterServiceVersionInterface)(nil).UpdateCSV), csv)
func (_mr *_MockClusterServiceVersionInterfaceRecorder) UpdateCSV(arg0 interface{}) *gomock.Call {
return _mr.mock.ctrl.RecordCall(_mr.mock, "UpdateCSV", arg0)
}

// CreateCSV mocks base method
func (m *MockClusterServiceVersionInterface) CreateCSV(csv *v1alpha1.ClusterServiceVersion) error {
ret := m.ctrl.Call(m, "CreateCSV", csv)
func (_m *MockClusterServiceVersionInterface) CreateCSV(csv *v1alpha1.ClusterServiceVersion) error {
ret := _m.ctrl.Call(_m, "CreateCSV", csv)
ret0, _ := ret[0].(error)
return ret0
}

// CreateCSV indicates an expected call of CreateCSV
func (mr *MockClusterServiceVersionInterfaceMockRecorder) CreateCSV(csv interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCSV", reflect.TypeOf((*MockClusterServiceVersionInterface)(nil).CreateCSV), csv)
func (_mr *_MockClusterServiceVersionInterfaceRecorder) CreateCSV(arg0 interface{}) *gomock.Call {
return _mr.mock.ctrl.RecordCall(_mr.mock, "CreateCSV", arg0)
}