Skip to content

Commit 1bd24d0

Browse files
authored
servicemesh memberroll adjustments + unit test added (#423)
* memberroll unit test * memberroll pkg adjustments
1 parent c6f7a7e commit 1bd24d0

4 files changed

Lines changed: 542 additions & 18 deletions

File tree

pkg/clients/clients.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ import (
9090
fakeRuntimeClient "sigs.k8s.io/controller-runtime/pkg/client/fake"
9191

9292
operatorv1 "github.com/openshift/api/operator/v1"
93+
istiov1 "maistra.io/api/core/v1"
94+
istiov2 "maistra.io/api/core/v2"
9395

9496
nvidiagpuv1 "github.com/NVIDIA/gpu-operator/api/v1"
9597
grafanaV4V1Alpha1 "github.com/grafana-operator/grafana-operator/v4/api/integreatly/v1alpha1"
@@ -366,6 +368,14 @@ func SetScheme(crScheme *runtime.Scheme) error {
366368
return err
367369
}
368370

371+
if err := istiov1.AddToScheme(crScheme); err != nil {
372+
return err
373+
}
374+
375+
if err := istiov2.AddToScheme(crScheme); err != nil {
376+
return err
377+
}
378+
369379
return nil
370380
}
371381

@@ -485,6 +495,10 @@ func GetTestClients(tcp TestClientParams) *Settings {
485495
genericClientObjects = append(genericClientObjects, v)
486496
case *ocsoperatorv1.StorageCluster:
487497
genericClientObjects = append(genericClientObjects, v)
498+
case *istiov1.ServiceMeshMemberRoll:
499+
genericClientObjects = append(genericClientObjects, v)
500+
case *istiov2.ServiceMeshControlPlane:
501+
genericClientObjects = append(genericClientObjects, v)
488502
case *clov1.ClusterLogging:
489503
genericClientObjects = append(genericClientObjects, v)
490504
case *clov1.ClusterLogForwarder:
Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,32 @@ package servicemesh
33
import (
44
"context"
55
"fmt"
6+
"time"
67

8+
corev1 "k8s.io/api/core/v1"
79
k8serrors "k8s.io/apimachinery/pkg/api/errors"
10+
"k8s.io/apimachinery/pkg/util/wait"
811

912
"github.com/golang/glog"
1013
"github.com/openshift-kni/eco-goinfra/pkg/clients"
1114
"github.com/openshift-kni/eco-goinfra/pkg/msg"
1215
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13-
istioV1 "maistra.io/api/core/v1"
16+
istiov1 "maistra.io/api/core/v1"
1417
goclient "sigs.k8s.io/controller-runtime/pkg/client"
1518
)
1619

1720
// MemberRollBuilder provides a struct for serviceMeshMemberRoll object from the cluster and
1821
// a serviceMeshMemberRoll definition.
1922
type MemberRollBuilder struct {
2023
// serviceMeshMemberRoll definition, used to create the serviceMeshMemberRoll object.
21-
Definition *istioV1.ServiceMeshMemberRoll
24+
Definition *istiov1.ServiceMeshMemberRoll
2225
// Created serviceMeshMemberRoll object.
23-
Object *istioV1.ServiceMeshMemberRoll
26+
Object *istiov1.ServiceMeshMemberRoll
2427
// Used in functions that define or mutate serviceMeshMemberRoll definition. errorMsg is processed
2528
// before the serviceMeshMemberRoll object is created.
2629
errorMsg string
2730
// api client to interact with the cluster.
28-
apiClient *clients.Settings
31+
apiClient goclient.Client
2932
}
3033

3134
// NewMemberRollBuilder method creates new instance of builder.
@@ -34,8 +37,8 @@ func NewMemberRollBuilder(apiClient *clients.Settings, name, nsname string) *Mem
3437
"params: name: %s, namespace: %s", name, nsname)
3538

3639
builder := &MemberRollBuilder{
37-
apiClient: apiClient,
38-
Definition: &istioV1.ServiceMeshMemberRoll{
40+
apiClient: apiClient.Client,
41+
Definition: &istiov1.ServiceMeshMemberRoll{
3942
ObjectMeta: metav1.ObjectMeta{
4043
Name: name,
4144
Namespace: nsname,
@@ -46,26 +49,32 @@ func NewMemberRollBuilder(apiClient *clients.Settings, name, nsname string) *Mem
4649
if name == "" {
4750
glog.V(100).Infof("The name of the serviceMeshMemberRoll is empty")
4851

49-
builder.errorMsg = "The serviceMeshMemberRoll 'name' cannot be empty"
52+
builder.errorMsg = "serviceMeshMemberRoll 'name' cannot be empty"
5053
}
5154

5255
if nsname == "" {
5356
glog.V(100).Infof("The namespace of the serviceMeshMemberRoll is empty")
5457

55-
builder.errorMsg = "The serviceMeshMemberRoll 'namespace' cannot be empty"
58+
builder.errorMsg = "serviceMeshMemberRoll 'nsname' cannot be empty"
5659
}
5760

5861
return builder
5962
}
6063

61-
// PullMemberRole retrieves an existing serviceMeshMemberRoll object from the cluster.
62-
func PullMemberRole(apiClient *clients.Settings, name, nsname string) (*MemberRollBuilder, error) {
64+
// PullMemberRoll retrieves an existing serviceMeshMemberRoll object from the cluster.
65+
func PullMemberRoll(apiClient *clients.Settings, name, nsname string) (*MemberRollBuilder, error) {
6366
glog.V(100).Infof(
6467
"Pulling serviceMeshMemberRoll object name: %s in namespace: %s", name, nsname)
6568

69+
if apiClient == nil {
70+
glog.V(100).Infof("The apiClient is empty")
71+
72+
return nil, fmt.Errorf("serviceMeshMemberRoll 'apiClient' cannot be empty")
73+
}
74+
6675
builder := MemberRollBuilder{
67-
apiClient: apiClient,
68-
Definition: &istioV1.ServiceMeshMemberRoll{
76+
apiClient: apiClient.Client,
77+
Definition: &istiov1.ServiceMeshMemberRoll{
6978
ObjectMeta: metav1.ObjectMeta{
7079
Name: name,
7180
Namespace: nsname,
@@ -76,13 +85,13 @@ func PullMemberRole(apiClient *clients.Settings, name, nsname string) (*MemberRo
7685
if name == "" {
7786
glog.V(100).Infof("The name of the serviceMeshMemberRoll is empty")
7887

79-
builder.errorMsg = "serviceMeshMemberRoll 'name' cannot be empty"
88+
return nil, fmt.Errorf("serviceMeshMemberRoll 'name' cannot be empty")
8089
}
8190

8291
if nsname == "" {
8392
glog.V(100).Infof("The namespace of the serviceMeshMemberRoll is empty")
8493

85-
builder.errorMsg = "serviceMeshMemberRoll 'nsname' cannot be empty"
94+
return nil, fmt.Errorf("serviceMeshMemberRoll 'nsname' cannot be empty")
8695
}
8796

8897
if !builder.Exists() {
@@ -95,15 +104,15 @@ func PullMemberRole(apiClient *clients.Settings, name, nsname string) (*MemberRo
95104
}
96105

97106
// Get fetches existing serviceMeshMemberRoll from cluster.
98-
func (builder *MemberRollBuilder) Get() (*istioV1.ServiceMeshMemberRoll, error) {
107+
func (builder *MemberRollBuilder) Get() (*istiov1.ServiceMeshMemberRoll, error) {
99108
if valid, err := builder.validate(); !valid {
100109
return nil, err
101110
}
102111

103112
glog.V(100).Infof("Fetching existing serviceMeshMemberRoll with name %s under namespace %s from cluster",
104113
builder.Definition.Name, builder.Definition.Namespace)
105114

106-
servicemeshmemberroll := &istioV1.ServiceMeshMemberRoll{}
115+
servicemeshmemberroll := &istiov1.ServiceMeshMemberRoll{}
107116
err := builder.apiClient.Get(context.TODO(), goclient.ObjectKey{
108117
Name: builder.Definition.Name,
109118
Namespace: builder.Definition.Namespace,
@@ -213,7 +222,7 @@ func (builder *MemberRollBuilder) Exists() bool {
213222
return err == nil || !k8serrors.IsNotFound(err)
214223
}
215224

216-
// WithMembersList adds member list section to the ServiceMeshMemberRoleBuilder.
225+
// WithMembersList adds member list section to the MemberRollBuilder.
217226
func (builder *MemberRollBuilder) WithMembersList(membersList []string) *MemberRollBuilder {
218227
glog.V(100).Infof("Adding member list %v section to the MemberRollBuilder", membersList)
219228

@@ -236,6 +245,54 @@ func (builder *MemberRollBuilder) WithMembersList(membersList []string) *MemberR
236245
return builder
237246
}
238247

248+
// GetMembersList fetches memberRoll's membersList.
249+
func (builder *MemberRollBuilder) GetMembersList() (*[]string, error) {
250+
if valid, err := builder.validate(); !valid {
251+
return nil, err
252+
}
253+
254+
glog.V(100).Infof("Getting memberRoll %s in namespace %s membersList configuration",
255+
builder.Definition.Name, builder.Definition.Namespace)
256+
257+
if !builder.Exists() {
258+
return nil, fmt.Errorf("memberRoll object %s does not exist in namespace %s",
259+
builder.Definition.Name, builder.Definition.Namespace)
260+
}
261+
262+
return &builder.Object.Spec.Members, nil
263+
}
264+
265+
// IsReady check if the ServiceMesh MemberRoll is Ready.
266+
func (builder *MemberRollBuilder) IsReady(timeout time.Duration) (bool, error) {
267+
if valid, err := builder.validate(); !valid {
268+
return false, err
269+
}
270+
271+
err := wait.PollUntilContextTimeout(
272+
context.TODO(), time.Second, timeout, true, func(ctx context.Context) (bool, error) {
273+
if !builder.Exists() {
274+
return false, nil
275+
}
276+
277+
for _, condition := range builder.Object.Status.Conditions {
278+
if condition.Type == istiov1.ConditionTypeMemberRollReady {
279+
if condition.Status == corev1.ConditionTrue {
280+
return true, nil
281+
}
282+
}
283+
}
284+
285+
return false, nil
286+
})
287+
288+
if err != nil {
289+
return false, fmt.Errorf("the Ready condition did not reached for the Service Mesh MemberRoll %s in "+
290+
"namespace %s during %v; %v", builder.Definition.Name, builder.Definition.Namespace, timeout, err)
291+
}
292+
293+
return true, nil
294+
}
295+
239296
// validate will check that the builder and builder definition are properly initialized before
240297
// accessing any member fields.
241298
func (builder *MemberRollBuilder) validate() (bool, error) {

0 commit comments

Comments
 (0)