Skip to content

Commit

Permalink
Merge pull request #38 from mittwald/update-to-latest-operator-sdk
Browse files Browse the repository at this point in the history
bump to operator-sdk v0.18.2
  • Loading branch information
hensur authored Aug 26, 2020
2 parents 3511d4a + a40a674 commit bb01aba
Show file tree
Hide file tree
Showing 9 changed files with 583 additions and 389 deletions.
42 changes: 9 additions & 33 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/mittwald/harbor-operator

go 1.13
go 1.15

require (
github.com/elazarl/goproxy v0.0.0-20200315184450-1f3cb6622dad // indirect
Expand All @@ -11,51 +11,27 @@ require (
github.com/golang/mock v1.4.3
github.com/imdario/mergo v0.3.8
github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a
github.com/json-iterator/go v1.1.8 // indirect
github.com/mattn/go-colorable v0.1.6 // indirect
github.com/mittwald/go-helm-client v0.2.0
github.com/mittwald/go-helm-client v0.3.0
github.com/mittwald/goharbor-client v1.0.4
github.com/operator-framework/operator-sdk v0.16.0
github.com/operator-framework/operator-sdk v0.18.2
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.4.0
github.com/stretchr/testify v1.6.1
go.mongodb.org/mongo-driver v1.3.5 // indirect
golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f // indirect
gopkg.in/yaml.v2 v2.3.0
helm.sh/helm/v3 v3.1.2
k8s.io/api v0.18.0
k8s.io/apimachinery v0.17.2
helm.sh/helm/v3 v3.2.4
k8s.io/api v0.18.2
k8s.io/apimachinery v0.18.2
k8s.io/client-go v12.0.0+incompatible
k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a // indirect
sigs.k8s.io/controller-runtime v0.5.2
sigs.k8s.io/controller-runtime v0.6.0
)

// Pinned to kubernetes-1.16.2
replace (
k8s.io/api => k8s.io/api v0.0.0-20191016110408-35e52d86657a
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.0.0-20191016113550-5357c4baaf65
k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20191004115801-a2eda9f80ab8
k8s.io/apiserver => k8s.io/apiserver v0.0.0-20191016112112-5190913f932d
k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20191016114015-74ad18325ed5
k8s.io/client-go => k8s.io/client-go v0.0.0-20191016111102-bec269661e48
k8s.io/cloud-provider => k8s.io/cloud-provider v0.0.0-20191016115326-20453efc2458
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.0.0-20191016115129-c07a134afb42
k8s.io/code-generator => k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894
k8s.io/component-base => k8s.io/component-base v0.0.0-20191016111319-039242c015a9
k8s.io/cri-api => k8s.io/cri-api v0.0.0-20190828162817-608eb1dad4ac
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.0.0-20191016115521-756ffa5af0bd
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.0.0-20191016112429-9587704a8ad4
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.0.0-20191016114939-2b2b218dc1df
k8s.io/kube-proxy => k8s.io/kube-proxy v0.0.0-20191016114407-2e83b6f20229
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.0.0-20191016114748-65049c67a58b
k8s.io/kubectl => k8s.io/kubectl v0.0.0-20191016120415-2ed914427d51
k8s.io/kubelet => k8s.io/kubelet v0.0.0-20191016114556-7841ed97f1b2
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.0.0-20191016115753-cf0698c3a16b
k8s.io/metrics => k8s.io/metrics v0.0.0-20191016113814-3b1a734dba6e
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.0.0-20191016112829-06bb3c9d77c9
github.com/Azure/go-autorest => github.com/Azure/go-autorest v13.3.2+incompatible // Required by OLM
k8s.io/client-go => k8s.io/client-go v0.18.2 // Required by prometheus-operator
)

replace github.com/docker/docker => github.com/moby/moby v0.7.3-0.20190826074503-38ab9da00309 // Required by Helm

replace github.com/openshift/api => github.com/openshift/api v0.0.0-20190924102528-32369d4db2ad // Required until https://github.com/operator-framework/operator-lifecycle-manager/pull/1241 is resolved
818 changes: 510 additions & 308 deletions go.sum

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions pkg/controller/instance/instance_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func (r *ReconcileInstance) Reconcile(request reconcile.Request) (reconcile.Resu

helper.PushFinalizer(harbor, FinalizerName)

err = r.installOrUpgradeHelmChart(chartSpec)
err = r.installOrUpgradeHelmChart(ctx, chartSpec)
if err != nil {
return reconcile.Result{RequeueAfter: 60 * time.Second}, err
}
Expand Down Expand Up @@ -268,14 +268,14 @@ func (r *ReconcileInstance) updateHelmRepos() error {
}

// installOrUpgradeHelmChart installs and upgrades a helm chart.
func (r *ReconcileInstance) installOrUpgradeHelmChart(helmChart *helmclient.ChartSpec) error {
func (r *ReconcileInstance) installOrUpgradeHelmChart(ctx context.Context, helmChart *helmclient.ChartSpec) error {
helmClient, err := r.helmClientReceiver(config.Config.HelmClientRepositoryCachePath,
config.Config.HelmClientRepositoryConfigPath, helmChart.Namespace)
if err != nil {
return err
}

return helmClient.InstallOrUpgradeChart(helmChart)
return helmClient.InstallOrUpgradeChart(ctx, helmChart)
}

// uninstallHelmRelease uninstalls a helm release.
Expand Down
12 changes: 9 additions & 3 deletions pkg/controller/instance/instance_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,12 +173,14 @@ func TestInstanceController_Instance_Installation(t *testing.T) {
chartSecret := testingregistriesv1alpha1.CreateSecret(i.Name+"-harbor-core", "foobar")
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&i, &chartSecret})

ctx := context.TODO()

ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockClient := helmclientmock.NewMockClient(ctrl)
gomock.InOrder(
mockClient.EXPECT().UpdateChartRepos(),
mockClient.EXPECT().InstallOrUpgradeChart(&helmclient.ChartSpec{
mockClient.EXPECT().InstallOrUpgradeChart(ctx, &helmclient.ChartSpec{
ReleaseName: i.Spec.HelmChart.ReleaseName,
ChartName: i.Spec.HelmChart.ChartName,
Namespace: i.Spec.HelmChart.Namespace,
Expand Down Expand Up @@ -410,12 +412,14 @@ func TestInstanceController_Add_Finalizer(t *testing.T) {

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&i, &instanceSecret})

ctx := context.TODO()

ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockClient := helmclientmock.NewMockClient(ctrl)
gomock.InOrder(
mockClient.EXPECT().UpdateChartRepos(),
mockClient.EXPECT().InstallOrUpgradeChart(&helmclient.ChartSpec{
mockClient.EXPECT().InstallOrUpgradeChart(ctx, &helmclient.ChartSpec{
ReleaseName: i.Spec.HelmChart.ReleaseName,
ChartName: i.Spec.HelmChart.ChartName,
Namespace: i.Spec.HelmChart.Namespace,
Expand Down Expand Up @@ -472,12 +476,14 @@ func TestInstanceController_Existing_Finalizer(t *testing.T) {

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&i, &instanceSecret})

ctx := context.TODO()

ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockClient := helmclientmock.NewMockClient(ctrl)
gomock.InOrder(
mockClient.EXPECT().UpdateChartRepos(),
mockClient.EXPECT().InstallOrUpgradeChart(&helmclient.ChartSpec{
mockClient.EXPECT().InstallOrUpgradeChart(ctx, &helmclient.ChartSpec{
ReleaseName: i.Spec.HelmChart.ReleaseName,
ChartName: i.Spec.HelmChart.ChartName,
Namespace: i.Spec.HelmChart.Namespace,
Expand Down
15 changes: 10 additions & 5 deletions pkg/controller/registry/registry_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,16 @@ func buildReconcileWithFakeClientWithMocks(objs []runtime.Object) *ReconcileRegi
// Test reconciliation with a non existent instance object which is expected to be requeued
// + Test reconciliation with an Instance with error status in loop.
func TestRegistryController_Instance_Phase(t *testing.T) {
reg := registriesv1alpha1.Registry{}

// Test reconciliation with a non existent instance object
// Expect: Result without requeue + no error.

ns := "test-namespace"

instance := testingregistriesv1alpha1.CreateInstance("test-instance", ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

reg := testingregistriesv1alpha1.CreateRegistry("test-registry", ns, instance.Spec.Name)

t.Run("NonExistentInstance", func(t *testing.T) {
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&reg})
req := reconcile.Request{
Expand All @@ -60,13 +66,12 @@ func TestRegistryController_Instance_Phase(t *testing.T) {
}
})

i := registriesv1alpha1.Instance{}
i.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseError
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseError

// Test with an Instance in error status in loop.
// Expect: Result without requeue + no error.
t.Run("UnreadyInstance", func(t *testing.T) {
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&reg, &i})
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&reg, &instance})
req := reconcile.Request{
NamespacedName: types.NamespacedName{
Name: reg.Name,
Expand Down
27 changes: 15 additions & 12 deletions pkg/controller/replication/replication_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client/fake"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

// buildReconcileWithFakeClientWithMocks
// returns a reconcile with fake client, schemes and mock objects
// reference: https://github.com/aerogear/mobile-security-service-operator/blob/e74272a6c7addebdc77b18eeffb5e888b35f4dfd/pkg/controller/mobilesecurityservice/fakeclient_test.go#L14
Expand All @@ -35,10 +34,15 @@ func buildReconcileWithFakeClientWithMocks(objs []runtime.Object) *ReconcileRepl
}

func TestReplicationController_Instance_Phase(t *testing.T) {
rep := registriesv1alpha1.Replication{}

// Test reconciliation with a non existent instance object
// Expect: Result without requeue + no error.
ns := "test-namespace"

instance := testingregistriesv1alpha1.CreateInstance("test-instance", ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

rep := testingregistriesv1alpha1.CreateReplication("test-replication", ns, instance.Spec.Name)

t.Run("NonExistentInstance", func(t *testing.T) {
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&rep})
req := reconcile.Request{
Expand All @@ -58,13 +62,12 @@ func TestReplicationController_Instance_Phase(t *testing.T) {
}
})

i := registriesv1alpha1.Instance{}
i.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseError
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseError

// Test with an Instance in error status in loop.
// Expect: Result without requeue + no error.
t.Run("UnreadyInstance", func(t *testing.T) {
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&rep, &i})
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&rep, &instance})
req := reconcile.Request{
NamespacedName: types.NamespacedName{
Name: rep.Name,
Expand All @@ -89,20 +92,20 @@ func TestReplicationController_Replication_Deletion(t *testing.T) {
instance := testingregistriesv1alpha1.CreateInstance("test-instance", ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

repo := testingregistriesv1alpha1.CreateReplication("test-replication", ns, instance.Spec.Name)
repo.Status.Phase = registriesv1alpha1.ReplicationStatusPhaseReady
rep := testingregistriesv1alpha1.CreateReplication("test-replication", ns, instance.Spec.Name)
rep.Status.Phase = registriesv1alpha1.ReplicationStatusPhaseReady

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&repo, &instance})
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&rep, &instance})

err := r.client.Delete(context.TODO(), &repo)
err := r.client.Delete(context.TODO(), &rep)
if err != nil {
t.Error("could not delete replication")
}

req := reconcile.Request{
NamespacedName: types.NamespacedName{
Name: repo.Name,
Namespace: repo.Namespace,
Name: rep.Name,
Namespace: rep.Namespace,
},
}

Expand Down
12 changes: 10 additions & 2 deletions pkg/controller/repository/repository_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,15 @@ func buildReconcileWithFakeClientWithMocks(objs []runtime.Object) *ReconcileRepo
// TestRepositoryController_NonExistent_Instance
// Test reconciliation with a non existent instance object
func TestRepositoryController_NonExistent_Instance(t *testing.T) {
repo := registriesv1alpha1.Repository{}
ns := "test-namespace"

instance := testingregistriesv1alpha1.CreateInstance("test-instance", ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

user := testingregistriesv1alpha1.CreateUser("test-user", ns, instance.Name)
user.Spec.ParentInstance.Name = instance.Spec.Name

repo := testingregistriesv1alpha1.CreateRepository("test-repository", ns, instance.Spec.Name)

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&repo})

Expand Down Expand Up @@ -120,7 +128,7 @@ func TestRepositoryController_Repository_Deletion(t *testing.T) {
instance := testingregistriesv1alpha1.CreateInstance("test-instance", ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

user := testingregistriesv1alpha1.CreateUser("test-user", ns)
user := testingregistriesv1alpha1.CreateUser("test-user", ns, instance.Name)
user.Spec.ParentInstance.Name = instance.Spec.Name

repo := testingregistriesv1alpha1.CreateRepository("test-repository", ns, instance.Spec.Name)
Expand Down
24 changes: 8 additions & 16 deletions pkg/controller/user/user_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import (
"testing"
"time"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

registriesv1alpha1 "github.com/mittwald/harbor-operator/pkg/apis/registries/v1alpha1"
testingregistriesv1alpha1 "github.com/mittwald/harbor-operator/pkg/testing/registriesv1alpha1"
"k8s.io/apimachinery/pkg/runtime"
Expand All @@ -17,6 +15,7 @@ import (
)

const (
username string = "test-user"
ns string = "test-namespace"
instanceName string = "test-instance"
)
Expand Down Expand Up @@ -47,12 +46,7 @@ func TestUserController_Empty_User_Spec(t *testing.T) {

instanceSecret := testingregistriesv1alpha1.CreateSecret(instance.Name+"-harbor-core", ns)

u := registriesv1alpha1.User{
ObjectMeta: metav1.ObjectMeta{
Name: "test-user",
Namespace: ns,
},
}
u := testingregistriesv1alpha1.CreateUser(username, ns, instanceName)

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&u, &instance, &instanceSecret})

Expand All @@ -74,7 +68,7 @@ func TestUserController_Empty_User_Spec(t *testing.T) {
}

func TestUserController_Instance_Phase(t *testing.T) {
u := registriesv1alpha1.User{}
u := testingregistriesv1alpha1.CreateUser(username, ns, instanceName)
// Test reconciliation with a non existent instance object which is expected to be requeued
// Expect: Result without requeue + no error.
t.Run("NonExistentInstance", func(t *testing.T) {
Expand All @@ -97,7 +91,7 @@ func TestUserController_Instance_Phase(t *testing.T) {
}
})

i := registriesv1alpha1.Instance{}
i := testingregistriesv1alpha1.CreateInstance(instanceName, ns)
i.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseError

// Test with an Instance in error status in loop.
Expand All @@ -116,18 +110,16 @@ func TestUserController_Instance_Phase(t *testing.T) {
if err == nil {
t.Error("reconciliation did not return error as expected")
}

if res.RequeueAfter != 30*time.Second {
t.Error("reconciliation did not requeue as expected")
}
})

t.Run("ExistingInstance", func(t *testing.T) {
instance := testingregistriesv1alpha1.CreateInstance(instanceName, ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

u := registriesv1alpha1.User{}
i.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&u, &instance})
r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&u, &i})

req := reconcile.Request{
NamespacedName: types.NamespacedName{
Expand All @@ -151,7 +143,7 @@ func TestUserController_User_Deletion(t *testing.T) {
instance := testingregistriesv1alpha1.CreateInstance(instanceName, ns)
instance.Status.Phase.Name = registriesv1alpha1.InstanceStatusPhaseInstalled

u := testingregistriesv1alpha1.CreateUser("test-user", ns)
u := testingregistriesv1alpha1.CreateUser(username, ns, instanceName)
u.Spec.ParentInstance.Name = instance.Spec.Name

r := buildReconcileWithFakeClientWithMocks([]runtime.Object{&u, &instance})
Expand Down
16 changes: 9 additions & 7 deletions pkg/testing/registriesv1alpha1/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,21 @@ import (
)

// CreateUser returns a user object with sample values.
func CreateUser(name, namespace string) registriesv1alpha1.User {
func CreateUser(name, namespace, instanceRef string) registriesv1alpha1.User {
u := registriesv1alpha1.User{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: namespace,
},
Spec: registriesv1alpha1.UserSpec{
Name: name,
ParentInstance: corev1.LocalObjectReference{},
RealName: "harbor user",
Email: "[email protected]",
UserSecretRef: corev1.LocalObjectReference{},
AdminRole: false,
Name: name,
ParentInstance: corev1.LocalObjectReference{
Name: instanceRef,
},
RealName: "harbor user",
Email: "[email protected]",
UserSecretRef: corev1.LocalObjectReference{},
AdminRole: false,
},
}

Expand Down

0 comments on commit bb01aba

Please sign in to comment.