Skip to content

Commit 3eaa633

Browse files
authored
Merge pull request #134 from bkhadars/pagination
Added changes for handling pagination of service instances
2 parents d575e0b + 87a4692 commit 3eaa633

File tree

2 files changed

+57
-56
lines changed

2 files changed

+57
-56
lines changed

cmd/image/import/import.go

Lines changed: 36 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
package _import
1616

1717
import (
18-
"encoding/json"
1918
"fmt"
2019
"os"
2120
"strings"
2221
"time"
2322

24-
"github.com/IBM/go-sdk-core/v4/core"
25-
rcv2 "github.com/IBM/platform-services-go-sdk/resourcecontrollerv2"
23+
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev1/controller"
24+
"github.com/IBM-Cloud/bluemix-go/api/resource/resourcev2/controllerv2"
25+
"github.com/IBM-Cloud/bluemix-go/crn"
26+
"github.com/IBM-Cloud/bluemix-go/models"
2627
"github.com/spf13/cobra"
2728
"k8s.io/apimachinery/pkg/util/wait"
2829
"k8s.io/klog/v2"
@@ -85,37 +86,30 @@ pvsadm image import -n upstream-core-lon04 -b <BUCKETNAME> --object rhel-83-1003
8586
}
8687

8788
bxCli, err := client.NewClientWithEnv(apikey, pkg.Options.Environment, pkg.Options.Debug)
88-
89-
if err != nil {
90-
return err
91-
}
92-
93-
auth, err := core.NewIamAuthenticator(apikey, "", "", "", false, nil)
9489
if err != nil {
9590
return err
9691
}
9792

98-
resourceController, err := client.NewResourceControllerV2(&rcv2.ResourceControllerV2Options{
99-
Authenticator: auth,
100-
})
101-
if err != nil {
102-
return err
103-
}
104-
105-
serviceListOptions := resourceController.ResourceControllerV2.NewListResourceInstancesOptions().SetType("service_instance")
93+
var svcs []models.ServiceInstanceV2
10694
if opt.COSInstanceName != "" {
107-
serviceListOptions.SetName(opt.COSInstanceName)
95+
svcs, err = bxCli.ResourceClientV2.ListInstances(controllerv2.ServiceInstanceQuery{
96+
Type: "service_instance",
97+
Name: opt.COSInstanceName,
98+
})
99+
} else {
100+
svcs, err = bxCli.ResourceClientV2.ListInstances(controllerv2.ServiceInstanceQuery{
101+
Type: "service_instance",
102+
})
108103
}
109-
instances, _, err := resourceController.ResourceControllerV2.ListResourceInstances(serviceListOptions)
110104
if err != nil {
111105
return err
112106
}
113107

114108
// Step 1: Find where COS for the bucket
115-
cosOfBucket := func(resources []rcv2.ResourceInstance) *rcv2.ResourceInstance {
109+
cosOfBucket, id, crn := func(resources []models.ServiceInstanceV2) (string, string, crn.CRN) {
116110
for _, resource := range resources {
117-
if strings.Contains(*resource.Crn, "cloud-object-storage") {
118-
s3client, err = client.NewS3Client(bxCli, *resource.Name, opt.Region)
111+
if resource.Crn.ServiceName == "cloud-object-storage" {
112+
s3client, err = client.NewS3Client(bxCli, resource.Name, opt.Region)
119113
if err != nil {
120114
continue
121115
}
@@ -125,18 +119,18 @@ pvsadm image import -n upstream-core-lon04 -b <BUCKETNAME> --object rhel-83-1003
125119
}
126120
for _, bucket := range buckets.Buckets {
127121
if *bucket.Name == opt.BucketName {
128-
return &resource
122+
return resource.Name, resource.Guid, resource.Crn
129123
}
130124
}
131125
}
132126
}
133-
return nil
134-
}(instances.Resources)
127+
return "", "", crn.CRN{}
128+
}(svcs)
135129

136-
if cosOfBucket == nil {
130+
if cosOfBucket == "" {
137131
return fmt.Errorf("failed to find the COS instance for the bucket mentioned: %s", opt.BucketName)
138132
}
139-
klog.Infof("%s bucket found in the %s[ID:%s] COS instance", opt.BucketName, *cosOfBucket.Name, *cosOfBucket.ID)
133+
klog.Infof("%s bucket found in the %s[ID:%s] COS instance", opt.BucketName, cosOfBucket, id)
140134

141135
//Step 2: Check if s3 object exists
142136
objectExists := s3client.CheckIfObjectExists(opt.BucketName, opt.ImageFilename)
@@ -150,51 +144,42 @@ pvsadm image import -n upstream-core-lon04 -b <BUCKETNAME> --object rhel-83-1003
150144

151145
// frame the unique name for the service credential
152146
if opt.ServiceCredName == "" {
153-
opt.ServiceCredName = serviceCredPrefix + "-" + *cosOfBucket.Name
147+
opt.ServiceCredName = serviceCredPrefix + "-" + cosOfBucket
154148
}
155149

156-
keys, err := resourceController.ListResourceKeysBySourceCrn(opt.ServiceCredName, *cosOfBucket.Crn)
150+
keys, err := bxCli.GetResourceKeys(id)
157151
if err != nil {
158152
return fmt.Errorf("failed to list the service credentials: %v", err)
159153
}
160154

161-
cred := new(rcv2.Credentials)
155+
var cred map[string]interface{}
156+
var ok bool
162157
if len(keys) == 0 {
163158
// Create the service credential if does not exist
164159
klog.Infof("Auto Generating the COS Service credential for importing the image with name: %s", opt.ServiceCredName)
165-
createResourceKeyOptions := &client.CreateResourceKeyOptions{
166-
CreateResourceKeyOptions: resourceController.ResourceControllerV2.NewCreateResourceKeyOptions(opt.ServiceCredName, *cosOfBucket.ID),
167-
Parameters: map[string]interface{}{"HMAC": true},
160+
CreateServiceKeyRequest := controller.CreateServiceKeyRequest{
161+
Name: opt.ServiceCredName,
162+
SourceCRN: crn,
163+
Parameters: map[string]interface{}{"HMAC": true},
168164
}
169-
170-
key, _, err := resourceController.CreateResourceKey(createResourceKeyOptions)
165+
newKey, err := bxCli.ResourceServiceKey.CreateKey(CreateServiceKeyRequest)
171166
if err != nil {
172167
return err
173168
}
174-
cred = key.Credentials
169+
cred, ok = newKey.Credentials["cos_hmac_keys"].(map[string]interface{})
175170
} else {
176171
// Use the service credential already created
177172
klog.Infof("Reading the existing service credential: %s", opt.ServiceCredName)
178-
cred = keys[0].Credentials
173+
cred, ok = keys[0].Credentials["cos_hmac_keys"].(map[string]interface{})
179174
}
180175

181-
jsonString, err := json.Marshal(cred.GetProperty("cos_hmac_keys"))
182-
if err != nil {
183-
return err
184-
}
185-
h := struct {
186-
AccessKeyID string `json:"access_key_id"`
187-
SecretKeyID string `json:"secret_access_key"`
188-
}{}
189-
err = json.Unmarshal(jsonString, &h)
190-
if err != nil {
191-
klog.Errorf("failed to unmarshal the access credentials from the auto generated service credential")
192-
return err
176+
if !ok {
177+
return fmt.Errorf("failed to get the accessKey and secretKey from service credential")
193178
}
194179

195180
// Step 4: Assign the Access Key and Secret Key for further operation
196-
opt.AccessKey = h.AccessKeyID
197-
opt.SecretKey = h.SecretKeyID
181+
opt.AccessKey = cred["access_key_id"].(string)
182+
opt.SecretKey = cred["secret_access_key"].(string)
198183

199184
}
200185

pkg/client/client.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ import (
3636

3737
type Client struct {
3838
*bxsession.Session
39-
User *User
40-
ResourceClientV2 controllerv2.ResourceServiceInstanceRepository
41-
ResourceClientV1 controller.ResourceServiceInstanceRepository
42-
ResCatalogAPI catalog.ResourceCatalogRepository
43-
ResGroupAPI management.ResourceGroupRepository
39+
User *User
40+
ResourceClientV2 controllerv2.ResourceServiceInstanceRepository
41+
ResourceClientV1 controller.ResourceServiceInstanceRepository
42+
ResourceServiceKey controller.ResourceServiceKeyRepository
43+
ResCatalogAPI catalog.ResourceCatalogRepository
44+
ResGroupAPI management.ResourceGroupRepository
4445
}
4546

4647
func authenticateAPIKey(sess *bxsession.Session) error {
@@ -147,6 +148,7 @@ func NewClient(apikey, ep string, debug bool) (*Client, error) {
147148

148149
c.ResourceClientV2 = ctrlv2.ResourceServiceInstanceV2()
149150
c.ResourceClientV1 = ctrlv1.ResourceServiceInstance()
151+
c.ResourceServiceKey = ctrlv1.ResourceServiceKey()
150152
c.ResCatalogAPI = catalogClient.ResourceCatalog()
151153
c.ResGroupAPI = managementClient.ResourceGroup()
152154
return c, nil
@@ -259,3 +261,17 @@ func (c *Client) DeleteServiceInstance(instanceID string, recursive bool) error
259261
}
260262
return nil
261263
}
264+
265+
func (c *Client) GetResourceKeys(instanceID string) ([]models.ServiceKey, error) {
266+
keys, err := c.ResourceServiceKey.GetKeys("")
267+
if err != nil {
268+
return nil, err
269+
}
270+
var instance_keys []models.ServiceKey
271+
for _, key := range keys {
272+
if key.Crn.ServiceInstance == instanceID && key.State == "active" {
273+
instance_keys = append(instance_keys, key)
274+
}
275+
}
276+
return instance_keys, nil
277+
}

0 commit comments

Comments
 (0)