Skip to content

Commit

Permalink
Update Operator Subnet tests to use mocks (#1592)
Browse files Browse the repository at this point in the history
  • Loading branch information
cesnietor committed May 1, 2023
1 parent 53bb3c6 commit 29e7431
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 38 deletions.
43 changes: 28 additions & 15 deletions api/operator_subnet.go
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/minio/operator/api/operations"
"github.com/minio/operator/api/operations/operator_api"
"github.com/minio/operator/models"
miniov2 "github.com/minio/operator/pkg/apis/minio.min.io/v2"
v2 "github.com/minio/operator/pkg/apis/minio.min.io/v2"
xhttp "github.com/minio/operator/pkg/http"
"github.com/minio/operator/pkg/subnet"
Expand All @@ -38,6 +39,11 @@ var (
apiKeySecretEnvVar = "API_KEY_SECRET_NAME"
)

type tenantInterface struct {
tenant miniov2.Tenant
mAdminClient MinioAdmin
}

func registerOperatorSubnetHandlers(api *operations.OperatorAPI) {
api.OperatorAPIOperatorSubnetLoginHandler = operator_api.OperatorSubnetLoginHandlerFunc(func(params operator_api.OperatorSubnetLoginParams, session *models.Principal) middleware.Responder {
res, err := getOperatorSubnetLoginResponse(session, params)
Expand Down Expand Up @@ -130,26 +136,39 @@ func getOperatorSubnetRegisterAPIKeyResponse(session *models.Principal, params o
if err != nil {
return nil, ErrorWithContext(ctx, err)
}
tenants, err := getTenantsToRegister(ctx, session)
k8sClient := &k8sClient{client: clientSet}
tenants, err := getTenantsToRegister(ctx, session, k8sClient)
if err != nil {
return nil, ErrorWithContext(ctx, err)
}
k8sClient := &k8sClient{client: clientSet}
return registerTenants(ctx, tenants.Items, params.Body.APIKey, k8sClient)
return registerTenants(ctx, k8sClient, tenants, params.Body.APIKey)
}

func getTenantsToRegister(ctx context.Context, session *models.Principal) (*v2.TenantList, error) {
func getTenantsToRegister(ctx context.Context, session *models.Principal, k8sClient K8sClientI) ([]tenantInterface, error) {
opClientClientSet, err := GetOperatorClient(session.STSSessionToken)
if err != nil {
return nil, err
}
opClient := &operatorClient{client: opClientClientSet}
return opClient.TenantList(ctx, "", metav1.ListOptions{})
tenantList, err := opClient.TenantList(ctx, "", metav1.ListOptions{})
if err != nil {
return nil, err
}
tenantStructs := make([]tenantInterface, len(tenantList.Items))
for _, tenant := range tenantList.Items {
svcURL := tenant.GetTenantServiceURL()
mAdmin, err := getTenantAdminClient(ctx, k8sClient, &tenant, svcURL)
if err != nil {
return nil, err
}
tenantStructs = append(tenantStructs, tenantInterface{tenant: tenant, mAdminClient: AdminClient{Client: mAdmin}})
}
return tenantStructs, nil
}

func registerTenants(ctx context.Context, tenants []v2.Tenant, apiKey string, k8sClient K8sClientI) (*models.OperatorSubnetRegisterAPIKeyResponse, *models.Error) {
func registerTenants(ctx context.Context, k8sClient K8sClientI, tenants []tenantInterface, apiKey string) (*models.OperatorSubnetRegisterAPIKeyResponse, *models.Error) {
for _, tenant := range tenants {
if err := registerTenant(ctx, tenant, apiKey, k8sClient); err != nil {
if err := registerTenant(ctx, k8sClient, tenant.mAdminClient, tenant.tenant, apiKey); err != nil {
return nil, ErrorWithContext(ctx, err)
}
}
Expand Down Expand Up @@ -183,14 +202,8 @@ func SubnetRegisterWithAPIKey(ctx context.Context, minioClient MinioAdmin, apiKe
return true, nil
}

func registerTenant(ctx context.Context, tenant v2.Tenant, apiKey string, k8sClient K8sClientI) error {
svcURL := tenant.GetTenantServiceURL()
mAdmin, err := getTenantAdminClient(ctx, k8sClient, &tenant, svcURL)
if err != nil {
return err
}
adminClient := AdminClient{Client: mAdmin}
_, err = SubnetRegisterWithAPIKey(ctx, adminClient, apiKey)
func registerTenant(ctx context.Context, k8sClient K8sClientI, adminClient MinioAdmin, tenant v2.Tenant, apiKey string) error {
_, err := SubnetRegisterWithAPIKey(ctx, adminClient, apiKey)
return err
}

Expand Down
20 changes: 16 additions & 4 deletions api/operator_subnet_test.go
Expand Up @@ -18,13 +18,15 @@ package api

import (
"context"
"errors"
"fmt"
"net/http"
"net/http/httptest"
"net/url"
"os"
"testing"

"github.com/minio/madmin-go/v2"
"github.com/minio/operator/api/operations"
"github.com/minio/operator/api/operations/operator_api"
"github.com/minio/operator/models"
Expand All @@ -49,6 +51,7 @@ type OperatorSubnetTestSuite struct {
registerAPIKeyServer *httptest.Server
registerAPIKeyWithError bool
k8sClient k8sClientMock
adminClient AdminClientMock
}

func (suite *OperatorSubnetTestSuite) SetupSuite() {
Expand All @@ -58,6 +61,7 @@ func (suite *OperatorSubnetTestSuite) SetupSuite() {
suite.getAPIKeyServer = httptest.NewServer(http.HandlerFunc(suite.getAPIKeyHandler))
suite.registerAPIKeyServer = httptest.NewServer(http.HandlerFunc(suite.registerAPIKeyHandler))
suite.k8sClient = k8sClientMock{}
suite.adminClient = AdminClientMock{}
k8sClientCreateSecretMock = func(ctx context.Context, namespace string, secret *v1.Secret, opts metav1.CreateOptions) (*v1.Secret, error) {
return &corev1.Secret{}, nil
}
Expand Down Expand Up @@ -247,16 +251,24 @@ func (suite *OperatorSubnetTestSuite) initSubnetAPIKeyRequest() (params operator

func (suite *OperatorSubnetTestSuite) TestOperatorSubnetRegisterAPIKeyHandlerWithUnreachableTenant() {
ctx := context.Background()
res, err := registerTenants(ctx, []v2.Tenant{{
Spec: v2.TenantSpec{CredsSecret: &corev1.LocalObjectReference{Name: "secret-name"}},
}}, "mockAPIKey", suite.k8sClient)
MinioServerInfoMock = func(ctx context.Context) (madmin.InfoMessage, error) {
return madmin.InfoMessage{}, errors.New("error")
}
res, err := registerTenants(ctx, suite.k8sClient, []tenantInterface{
{
tenant: v2.Tenant{
Spec: v2.TenantSpec{CredsSecret: &corev1.LocalObjectReference{Name: "secret-name"}},
},
mAdminClient: suite.adminClient,
},
}, "mockAPIKey")
suite.assert.Nil(res)
suite.assert.NotNil(err)
}

func (suite *OperatorSubnetTestSuite) TestOperatorSubnetRegisterAPIKeyHandlerZeroTenants() {
ctx := context.Background()
res, err := registerTenants(ctx, []v2.Tenant{}, "mockAPIKey", suite.k8sClient)
res, err := registerTenants(ctx, suite.k8sClient, []tenantInterface{}, "mockAPIKey")
suite.assert.NotNil(res)
suite.assert.Nil(err)
}
Expand Down
42 changes: 29 additions & 13 deletions api/tenants_2_test.go
Expand Up @@ -617,14 +617,6 @@ func (suite *TenantTestSuite) TestSetTenantAdministratorsHandlerWithError() {
suite.assert.True(ok)
}

func (suite *TenantTestSuite) TestSetTenantAdministratorsWithAdminClientError() {
params, _ := suite.initSetTenantAdministratorsRequest()
tenant := &miniov2.Tenant{}
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, params)
suite.assert.NotNil(err)
}

// TODO: Mock minio adminclient
func (suite *TenantTestSuite) TestSetTenantAdministratorsWithUserPolicyError() {
params, _ := suite.initSetTenantAdministratorsRequest()
tenant := &miniov2.Tenant{
Expand All @@ -635,12 +627,14 @@ func (suite *TenantTestSuite) TestSetTenantAdministratorsWithUserPolicyError() {
},
},
}
minioSetPolicyMock = func(policyName, entityName string, isGroup bool) error {
return errors.New("error")
}
params.Body.UserDNS = []string{"mock-user"}
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, params)
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, suite.adminClient, params)
suite.assert.NotNil(err)
}

// TODO: Mock minio adminclient
func (suite *TenantTestSuite) TestSetTenantAdministratorsWithGroupPolicyError() {
params, _ := suite.initSetTenantAdministratorsRequest()
tenant := &miniov2.Tenant{
Expand All @@ -651,12 +645,34 @@ func (suite *TenantTestSuite) TestSetTenantAdministratorsWithGroupPolicyError()
},
},
}
minioSetPolicyMock = func(policyName, entityName string, isGroup bool) error {
return errors.New("error")
}
params.Body.GroupDNS = []string{"mock-user"}
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, params)
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, suite.adminClient, params)
suite.assert.NotNil(err)
}

func (suite *TenantTestSuite) TestSetTenantAdministratorsWithoutError() {
func (suite *TenantTestSuite) TestSetTenantAdministratorsGroupAndUserDnsWithoutError() {
params, _ := suite.initSetTenantAdministratorsRequest()
tenant := &miniov2.Tenant{
Spec: miniov2.TenantSpec{
Env: []corev1.EnvVar{
{Name: "accesskey", Value: "mock-access"},
{Name: "secretkey", Value: "mock-secret"},
},
},
}
minioSetPolicyMock = func(policyName, entityName string, isGroup bool) error {
return nil
}
params.Body.UserDNS = []string{"mock-user"}
params.Body.GroupDNS = []string{"mock-user"}
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, suite.adminClient, params)
suite.assert.Nil(err)
}

func (suite *TenantTestSuite) TestSetTenantAdministratorsEmptyWithoutError() {
params, _ := suite.initSetTenantAdministratorsRequest()
tenant := &miniov2.Tenant{
Spec: miniov2.TenantSpec{
Expand All @@ -666,7 +682,7 @@ func (suite *TenantTestSuite) TestSetTenantAdministratorsWithoutError() {
},
},
}
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, params)
err := setTenantAdministrators(context.Background(), tenant, suite.k8sclient, suite.adminClient, params)
suite.assert.Nil(err)
}

Expand Down
13 changes: 7 additions & 6 deletions api/users-handlers.go
Expand Up @@ -60,12 +60,6 @@ func getSetTenantAdministratorsResponse(session *models.Principal, params operat
if err != nil {
return ErrorWithContext(ctx, err)
}
return setTenantAdministrators(ctx, minTenant, k8sClient, params)
}

func setTenantAdministrators(ctx context.Context, minTenant *miniov2.Tenant, k8sClient K8sClientI, params operator_api.SetTenantAdministratorsParams) *models.Error {
minTenant.EnsureDefaults()

svcURL := GetTenantServiceURL(minTenant)
// getTenantAdminClient will use all certificates under ~/.console/certs/CAs to trust the TLS connections with MinIO tenants
mAdmin, err := getTenantAdminClient(
Expand All @@ -77,9 +71,16 @@ func setTenantAdministrators(ctx context.Context, minTenant *miniov2.Tenant, k8s
if err != nil {
return ErrorWithContext(ctx, err)
}

// create a minioClient interface implementation
// defining the client to be used
adminClient := AdminClient{Client: mAdmin}
return setTenantAdministrators(ctx, minTenant, k8sClient, adminClient, params)
}

func setTenantAdministrators(ctx context.Context, minTenant *miniov2.Tenant, k8sClient K8sClientI, adminClient MinioAdmin, params operator_api.SetTenantAdministratorsParams) *models.Error {
minTenant.EnsureDefaults()

for _, user := range params.Body.UserDNS {
if err := SetPolicy(ctx, adminClient, "consoleAdmin", user, "user"); err != nil {
return ErrorWithContext(ctx, err)
Expand Down

0 comments on commit 29e7431

Please sign in to comment.