@@ -13,6 +13,7 @@ import (
13
13
"net"
14
14
"net/http"
15
15
"os"
16
+ "path"
16
17
"strconv"
17
18
"strings"
18
19
"sync/atomic"
@@ -175,6 +176,8 @@ func (f *Frontend) ArmResourceList(writer http.ResponseWriter, request *http.Req
175
176
176
177
subscriptionID := request .PathValue (PathSegmentSubscriptionID )
177
178
resourceGroupName := request .PathValue (PathSegmentResourceGroupName )
179
+ resourceName := request .PathValue (PathSegmentResourceName )
180
+ resourceTypeName := path .Base (request .URL .Path )
178
181
179
182
// Even though the bulk of the list content comes from Cluster Service,
180
183
// we start by querying Cosmos DB because its continuation token meets
@@ -185,18 +188,22 @@ func (f *Frontend) ArmResourceList(writer http.ResponseWriter, request *http.Req
185
188
if resourceGroupName != "" {
186
189
prefixString += "/resourceGroups/" + resourceGroupName
187
190
}
191
+ if resourceName != "" {
192
+ prefixString += "/providers/" + api .ProviderNamespace
193
+ prefixString += "/" + api .ClusterResourceTypeName + "/" + resourceName
194
+ }
188
195
prefix , err := arm .ParseResourceID (prefixString )
189
196
if err != nil {
190
197
f .logger .Error (err .Error ())
191
198
arm .WriteInternalServerError (writer )
192
199
return
193
200
}
194
201
195
- iterator := f .dbClient .ListResourceDocs (ctx , prefix , pageSizeHint , continuationToken )
202
+ dbIterator := f .dbClient .ListResourceDocs (ctx , prefix , pageSizeHint , continuationToken )
196
203
197
204
// Build a map of cluster documents by Cluster Service cluster ID.
198
205
documentMap := make (map [string ]* database.ResourceDocument )
199
- for item := range iterator .Items (ctx ) {
206
+ for item := range dbIterator .Items (ctx ) {
200
207
var doc database.ResourceDocument
201
208
202
209
err = json .Unmarshal (item , & doc )
@@ -206,12 +213,12 @@ func (f *Frontend) ArmResourceList(writer http.ResponseWriter, request *http.Req
206
213
return
207
214
}
208
215
209
- if strings .EqualFold ( doc .Key .ResourceType .String ( ), api . ClusterResourceType . String () ) {
216
+ if strings .HasSuffix ( strings . ToLower ( doc .Key .ResourceType .Type ), resourceTypeName ) {
210
217
documentMap [doc .InternalID .ID ()] = & doc
211
218
}
212
219
}
213
220
214
- err = iterator .GetError ()
221
+ err = dbIterator .GetError ()
215
222
if err != nil {
216
223
f .logger .Error (err .Error ())
217
224
arm .WriteInternalServerError (writer )
@@ -226,33 +233,61 @@ func (f *Frontend) ArmResourceList(writer http.ResponseWriter, request *http.Req
226
233
query := fmt .Sprintf ("id in (%s)" , strings .Join (queryIDs , ", " ))
227
234
f .logger .Info (fmt .Sprintf ("Searching Cluster Service for %q" , query ))
228
235
229
- listRequest := f .clusterServiceClient .GetConn ().ClustersMgmt ().V1 ().Clusters ().List ().Search (query )
236
+ switch resourceTypeName {
237
+ case strings .ToLower (api .ClusterResourceTypeName ):
238
+ csIterator := f .clusterServiceClient .ListCSClusters (query )
239
+
240
+ for csCluster := range csIterator .Items (ctx ) {
241
+ if doc , ok := documentMap [csCluster .ID ()]; ok {
242
+ value , err := marshalCSCluster (csCluster , doc , versionedInterface )
243
+ if err != nil {
244
+ f .logger .Error (err .Error ())
245
+ arm .WriteInternalServerError (writer )
246
+ return
247
+ }
248
+ pagedResponse .AddValue (value )
249
+ }
250
+ }
251
+ err = csIterator .GetError ()
252
+
253
+ case strings .ToLower (api .NodePoolResourceTypeName ):
254
+ var resourceDoc * database.ResourceDocument
255
+
256
+ // Fetch the cluster document for the Cluster Service ID.
257
+ resourceDoc , err = f .dbClient .GetResourceDoc (ctx , prefix )
258
+ if err != nil {
259
+ f .logger .Error (err .Error ())
260
+ arm .WriteInternalServerError (writer )
261
+ return
262
+ }
263
+
264
+ csIterator := f .clusterServiceClient .ListCSNodePools (resourceDoc .InternalID , query )
230
265
231
- // XXX This SHOULD avoid dealing with pagination from Cluster Service.
232
- // As far I can tell, uhc-cluster-service does not impose its own
233
- // limit on the page size. Further testing is needed to verify.
234
- listRequest .Size (len (documentMap ))
266
+ for csNodePool := range csIterator .Items (ctx ) {
267
+ if doc , ok := documentMap [csNodePool .ID ()]; ok {
268
+ value , err := marshalCSNodePool (csNodePool , doc , versionedInterface )
269
+ if err != nil {
270
+ f .logger .Error (err .Error ())
271
+ arm .WriteInternalServerError (writer )
272
+ return
273
+ }
274
+ pagedResponse .AddValue (value )
275
+ }
276
+ }
277
+ err = csIterator .GetError ()
235
278
236
- listResponse , err := listRequest .SendContext (ctx )
279
+ default :
280
+ err = fmt .Errorf ("unsupported resource type: %s" , resourceTypeName )
281
+ }
282
+
283
+ // Check for iteration error.
237
284
if err != nil {
238
285
f .logger .Error (err .Error ())
239
286
arm .WriteInternalServerError (writer )
240
287
return
241
288
}
242
289
243
- for _ , csCluster := range listResponse .Items ().Slice () {
244
- if doc , ok := documentMap [csCluster .ID ()]; ok {
245
- value , err := marshalCSCluster (csCluster , doc , versionedInterface )
246
- if err != nil {
247
- f .logger .Error (err .Error ())
248
- arm .WriteInternalServerError (writer )
249
- return
250
- }
251
- pagedResponse .AddValue (value )
252
- }
253
- }
254
-
255
- err = pagedResponse .SetNextLink (request .Referer (), iterator .GetContinuationToken ())
290
+ err = pagedResponse .SetNextLink (request .Referer (), dbIterator .GetContinuationToken ())
256
291
if err != nil {
257
292
f .logger .Error (err .Error ())
258
293
arm .WriteInternalServerError (writer )
0 commit comments