Skip to content

Commit a2e7259

Browse files
authored
Allow to Specify the Tenant Console Image. Support Image Pull Secrets… (#245)
* Allow to Specify the Tenant Console Image. Support Image Pull Secrets by Name. This PR adds support for `console_image` on create tenant and update tenant so the console image can be set by the caller. This is in case the image used is hosted in a private registry. Also adds support to specify the Image Pull Secret, if it's not specified, the individual image registry credentials can still be specified. * Add tests for new fields.
1 parent d28e66a commit a2e7259

File tree

6 files changed

+168
-28
lines changed

6 files changed

+168
-28
lines changed

models/create_tenant_request.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/update_tenant_request.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

restapi/admin_tenants.go

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,6 @@ import (
5454
v1 "k8s.io/client-go/kubernetes/typed/core/v1"
5555
)
5656

57-
const (
58-
minioRegCred = "minio-regcred-secret"
59-
)
60-
6157
type imageRegistry struct {
6258
Auths map[string]imageRegistryCredentials `json:"auths"`
6359
}
@@ -589,7 +585,7 @@ func getTenantCreatedResponse(session *models.Principal, params admin_api.Create
589585

590586
const consoleVersion = "minio/console:v0.3.11"
591587
minInst.Spec.Console = &operator.ConsoleConfiguration{
592-
Replicas: 2,
588+
Replicas: 1,
593589
Image: consoleVersion,
594590
ConsoleSecret: &corev1.LocalObjectReference{Name: consoleSecretName},
595591
Resources: corev1.ResourceRequirements{
@@ -660,13 +656,25 @@ func getTenantCreatedResponse(session *models.Principal, params admin_api.Create
660656
minInst.Spec.Mountpath = tenantReq.MounthPath
661657
}
662658

663-
if err := setImageRegistry(ctx, tenantReq.ImageRegistry, clientset.CoreV1(), ns); err != nil {
659+
// We accept either `image_pull_secret` or the individual details of the `image_registry` but not both
660+
var imagePullSecret string
661+
662+
if tenantReq.ImagePullSecret != "" {
663+
imagePullSecret = tenantReq.ImagePullSecret
664+
} else if imagePullSecret, err = setImageRegistry(ctx, *tenantReq.Name, tenantReq.ImageRegistry, clientset.CoreV1(), ns); err != nil {
664665
log.Println("error setting image registry secret:", err)
665666
return nil, err
666667
}
668+
// pass the image pull secret to the Tenant
669+
if imagePullSecret != "" {
670+
minInst.Spec.ImagePullSecret = corev1.LocalObjectReference{
671+
Name: imagePullSecret,
672+
}
673+
}
667674

668-
minInst.Spec.ImagePullSecret = corev1.LocalObjectReference{
669-
Name: minioRegCred,
675+
// set console image if provided
676+
if tenantReq.ConsoleImage != "" {
677+
minInst.Spec.Console.Image = tenantReq.ConsoleImage
670678
}
671679

672680
opClient, err := cluster.OperatorClient(session.SessionToken)
@@ -700,9 +708,11 @@ func getTenantCreatedResponse(session *models.Principal, params admin_api.Create
700708
return response, nil
701709
}
702710

703-
func setImageRegistry(ctx context.Context, req *models.ImageRegistry, clientset v1.CoreV1Interface, namespace string) error {
711+
// setImageRegistry creates a secret to store the private registry credentials, if one exist it updates the existing one
712+
// returns the name of the secret created/updated
713+
func setImageRegistry(ctx context.Context, tenantName string, req *models.ImageRegistry, clientset v1.CoreV1Interface, namespace string) (string, error) {
704714
if req == nil || req.Registry == nil || req.Username == nil || req.Password == nil {
705-
return nil
715+
return "", nil
706716
}
707717

708718
credentials := make(map[string]imageRegistryCredentials)
@@ -720,12 +730,14 @@ func setImageRegistry(ctx context.Context, req *models.ImageRegistry, clientset
720730
}
721731
imRegistryJSON, err := json.Marshal(imRegistry)
722732
if err != nil {
723-
return err
733+
return "", err
724734
}
725735

736+
pullSecretName := fmt.Sprintf("%s-regcred", tenantName)
737+
726738
instanceSecret := corev1.Secret{
727739
ObjectMeta: metav1.ObjectMeta{
728-
Name: minioRegCred,
740+
Name: pullSecretName,
729741
},
730742
Data: map[string][]byte{
731743
corev1.DockerConfigJsonKey: []byte(string(imRegistryJSON)),
@@ -734,48 +746,58 @@ func setImageRegistry(ctx context.Context, req *models.ImageRegistry, clientset
734746
}
735747

736748
// Get or Create secret if it doesn't exist
737-
_, err = clientset.Secrets(namespace).Get(ctx, minioRegCred, metav1.GetOptions{})
749+
_, err = clientset.Secrets(namespace).Get(ctx, pullSecretName, metav1.GetOptions{})
738750
if err != nil {
739751
if k8sErrors.IsNotFound(err) {
740752
_, err = clientset.Secrets(namespace).Create(ctx, &instanceSecret, metav1.CreateOptions{})
741753
if err != nil {
742-
return err
754+
return "", err
743755
}
744-
return nil
756+
return "", nil
745757
}
746-
return err
758+
return "", err
747759
}
748760
_, err = clientset.Secrets(namespace).Update(ctx, &instanceSecret, metav1.UpdateOptions{})
749761
if err != nil {
750-
return err
762+
return "", err
751763
}
752-
return nil
764+
return pullSecretName, nil
753765
}
754766

755767
// updateTenantAction does an update on the minioTenant by patching the desired changes
756768
func updateTenantAction(ctx context.Context, operatorClient OperatorClient, clientset v1.CoreV1Interface, httpCl cluster.HTTPClientI, namespace string, params admin_api.UpdateTenantParams) error {
757769
imageToUpdate := params.Body.Image
758770
imageRegistryReq := params.Body.ImageRegistry
759771

760-
if err := setImageRegistry(ctx, imageRegistryReq, clientset, namespace); err != nil {
761-
log.Println("error setting image registry secret:", err)
762-
return err
763-
}
764-
765772
minInst, err := operatorClient.TenantGet(ctx, namespace, params.Tenant, metav1.GetOptions{})
766773
if err != nil {
767774
return err
768775
}
776+
// we can take either the `image_pull_secret` of the `image_registry` but not both
777+
if params.Body.ImagePullSecret != "" {
778+
minInst.Spec.ImagePullSecret.Name = params.Body.ImagePullSecret
779+
} else {
780+
// update the image pull secret content
781+
if _, err := setImageRegistry(ctx, params.Tenant, imageRegistryReq, clientset, namespace); err != nil {
782+
log.Println("error setting image registry secret:", err)
783+
return err
784+
}
785+
}
786+
787+
// update the console image
788+
if strings.TrimSpace(params.Body.ConsoleImage) != "" && minInst.Spec.Console != nil {
789+
minInst.Spec.Console.Image = params.Body.ConsoleImage
790+
}
769791

770792
// if image to update is empty we'll use the latest image by default
771793
if strings.TrimSpace(imageToUpdate) != "" {
772794
minInst.Spec.Image = imageToUpdate
773795
} else {
774796
im, err := cluster.GetLatestMinioImage(httpCl)
775-
if err != nil {
776-
return err
797+
// if we can't get the MinIO image, we won' auto-update it unless it's explicit by name
798+
if err == nil {
799+
minInst.Spec.Image = *im
777800
}
778-
minInst.Spec.Image = *im
779801
}
780802

781803
payloadBytes, err := json.Marshal(minInst)

restapi/admin_tenants_test.go

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ func Test_UpdateTenantAction(t *testing.T) {
647647
return &http.Response{}, nil
648648
},
649649
params: admin_api.UpdateTenantParams{
650+
Tenant: "minio-tenant",
650651
Body: &models.UpdateTenantRequest{
651652
Image: "minio/minio:RELEASE.2020-06-03T22-13-49Z",
652653
},
@@ -675,6 +676,7 @@ func Test_UpdateTenantAction(t *testing.T) {
675676
}, nil
676677
},
677678
params: admin_api.UpdateTenantParams{
679+
Tenant: "minio-tenant",
678680
Body: &models.UpdateTenantRequest{
679681
Image: "",
680682
},
@@ -683,7 +685,7 @@ func Test_UpdateTenantAction(t *testing.T) {
683685
wantErr: false,
684686
},
685687
{
686-
name: "Empty image input Error retrieving latest image",
688+
name: "Empty image input Error retrieving latest image, nothing happens",
687689
args: args{
688690
ctx: context.Background(),
689691
operatorClient: opClient,
@@ -700,12 +702,63 @@ func Test_UpdateTenantAction(t *testing.T) {
700702
return nil, errors.New("error")
701703
},
702704
params: admin_api.UpdateTenantParams{
705+
Tenant: "minio-tenant",
703706
Body: &models.UpdateTenantRequest{
704707
Image: "",
705708
},
706709
},
707710
},
708-
wantErr: true,
711+
wantErr: false,
712+
},
713+
{
714+
name: "Update minio console version no errors",
715+
args: args{
716+
ctx: context.Background(),
717+
operatorClient: opClient,
718+
httpCl: httpClientM,
719+
nameSpace: "default",
720+
tenantName: "minio-tenant",
721+
mockTenantPatch: func(ctx context.Context, namespace string, tenantName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.Tenant, error) {
722+
return &v1.Tenant{}, nil
723+
},
724+
mockTenantGet: func(ctx context.Context, namespace string, tenantName string, options metav1.GetOptions) (*v1.Tenant, error) {
725+
return &v1.Tenant{}, nil
726+
},
727+
mockHTTPClientGet: func(url string) (resp *http.Response, err error) {
728+
return nil, errors.New("use default minio")
729+
},
730+
params: admin_api.UpdateTenantParams{
731+
Body: &models.UpdateTenantRequest{
732+
ConsoleImage: "minio/console:v0.3.11",
733+
},
734+
},
735+
},
736+
wantErr: false,
737+
},
738+
{
739+
name: "Update minio image pull secrets no errors",
740+
args: args{
741+
ctx: context.Background(),
742+
operatorClient: opClient,
743+
httpCl: httpClientM,
744+
nameSpace: "default",
745+
tenantName: "minio-tenant",
746+
mockTenantPatch: func(ctx context.Context, namespace string, tenantName string, pt types.PatchType, data []byte, options metav1.PatchOptions) (*v1.Tenant, error) {
747+
return &v1.Tenant{}, nil
748+
},
749+
mockTenantGet: func(ctx context.Context, namespace string, tenantName string, options metav1.GetOptions) (*v1.Tenant, error) {
750+
return &v1.Tenant{}, nil
751+
},
752+
mockHTTPClientGet: func(url string) (resp *http.Response, err error) {
753+
return nil, errors.New("use default minio")
754+
},
755+
params: admin_api.UpdateTenantParams{
756+
Body: &models.UpdateTenantRequest{
757+
ImagePullSecret: "minio-regcred",
758+
},
759+
},
760+
},
761+
wantErr: false,
709762
},
710763
}
711764
for _, tt := range tests {

restapi/embedded_spec.go

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)