66 "io"
77 "net/http"
88 "net/url"
9+ "strconv"
910 "strings"
11+ "sync"
1012 "time"
1113)
1214
@@ -16,6 +18,8 @@ const (
1618 IBMGrantTypeFormValue = "grant_type"
1719 IBMApiKeyFormValue = "apikey"
1820 IBMAPIKeyGrantType = "urn:ibm:params:oauth:grant-type:apikey"
21+ SysdigTeamIDHeader = "SysdigTeamID"
22+ GetTeamByNamePath = "/api/v2/teams/light/name/"
1923)
2024
2125type IBMCommon interface {
@@ -30,10 +34,15 @@ type IBMAccessToken string
3034type UnixTimestamp int64
3135
3236type IBMRequest struct {
33- config * config
34- httpClient * http.Client
37+ config * config
38+ httpClient * http.Client
39+
40+ tokenLock * sync.Mutex
3541 tokenExpiration UnixTimestamp
3642 token IBMAccessToken
43+
44+ teamIDLock * sync.Mutex
45+ teamID * int
3746}
3847
3948type IAMTokenResponse struct {
@@ -42,6 +51,9 @@ type IAMTokenResponse struct {
4251}
4352
4453func (ir * IBMRequest ) getIBMIAMToken () (IBMAccessToken , error ) {
54+ ir .tokenLock .Lock ()
55+ defer ir .tokenLock .Unlock ()
56+
4557 if UnixTimestamp (time .Now ().Unix ()) < ir .tokenExpiration {
4658 return ir .token , nil
4759 }
@@ -75,6 +87,71 @@ func (ir *IBMRequest) getIBMIAMToken() (IBMAccessToken, error) {
7587 return ir .token , nil
7688}
7789
90+ func (ir * IBMRequest ) getTeamIDByName (ctx context.Context , name string , token IBMAccessToken ) (int , error ) {
91+ r , err := http .NewRequest (
92+ http .MethodGet ,
93+ fmt .Sprintf ("%s%s%s" , ir .config .url , GetTeamByNamePath , name ),
94+ nil ,
95+ )
96+ if err != nil {
97+ return - 1 , err
98+ }
99+
100+ r = r .WithContext (ctx )
101+ r .Header .Set (IBMInstanceIDHeader , ir .config .ibmInstanceID )
102+ r .Header .Set (AuthorizationHeader , fmt .Sprintf ("Bearer %s" , token ))
103+
104+ resp , err := request (ir .httpClient , ir .config , r )
105+ if err != nil {
106+ return - 1 , err
107+ }
108+ defer resp .Body .Close ()
109+
110+ wrapper , err := Unmarshal [teamWrapper ](resp .Body )
111+ if err != nil {
112+ return - 1 , err
113+ }
114+
115+ return wrapper .Team .ID , nil
116+ }
117+
118+ func (ir * IBMRequest ) CurrentTeamID (ctx context.Context ) (int , error ) {
119+ ir .teamIDLock .Lock ()
120+ defer ir .teamIDLock .Unlock ()
121+
122+ if ir .teamID != nil {
123+ return * ir .teamID , nil
124+ }
125+
126+ token , err := ir .getIBMIAMToken ()
127+ if err != nil {
128+ return - 1 , err
129+ }
130+
131+ if ir .config .sysdigTeamName != "" {
132+ teamID , err := ir .getTeamIDByName (ctx , ir .config .sysdigTeamName , token )
133+ if err != nil {
134+ return - 1 , err
135+ }
136+
137+ ir .teamID = & teamID
138+ return * ir .teamID , nil
139+ }
140+
141+ // use default current team
142+ user , err := getMe (ctx , ir .config , ir .httpClient , map [string ]string {
143+ IBMInstanceIDHeader : ir .config .ibmInstanceID ,
144+ AuthorizationHeader : fmt .Sprintf ("Bearer %s" , token ),
145+ })
146+ if err != nil {
147+ return - 1 , err
148+ }
149+
150+ ir .teamID = & user .CurrentTeam
151+
152+ return * ir .teamID , nil
153+ }
154+
78155func (ir * IBMRequest ) Request (ctx context.Context , method string , url string , payload io.Reader ) (* http.Response , error ) {
79156 r , err := http .NewRequest (method , url , payload )
80157 if err != nil {
@@ -86,9 +163,15 @@ func (ir *IBMRequest) Request(ctx context.Context, method string, url string, pa
86163 return nil , err
87164 }
88165
166+ teamID , err := ir .CurrentTeamID (ctx )
167+ if err != nil {
168+ return nil , err
169+ }
170+
89171 r = r .WithContext (ctx )
90172 r .Header .Set (IBMInstanceIDHeader , ir .config .ibmInstanceID )
91173 r .Header .Set (AuthorizationHeader , fmt .Sprintf ("Bearer %s" , token ))
174+ r .Header .Set (SysdigTeamIDHeader , strconv .Itoa (teamID ))
92175 r .Header .Set (ContentTypeHeader , ContentTypeJSON )
93176
94177 return request (ir .httpClient , ir .config , r )
@@ -99,8 +182,11 @@ func newIBMClient(opts ...ClientOption) *Client {
99182 return & Client {
100183 config : cfg ,
101184 requester : & IBMRequest {
185+ tokenLock : & sync.Mutex {},
186+ teamIDLock : & sync.Mutex {},
102187 config : cfg ,
103188 httpClient : newHTTPClient (cfg ),
189+ teamID : cfg .sysdigTeamID ,
104190 },
105191 }
106192}
0 commit comments