@@ -3,29 +3,32 @@ package servicemesh
33import (
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.
1922type 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 .
217226func (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.
241298func (builder * MemberRollBuilder ) validate () (bool , error ) {
0 commit comments