Skip to content

Commit 72de1cd

Browse files
authored
OCPBUGS-32233: Not able to enable repositories during entitled build in OCP Cluster on IBM-Z (openshift#988)
1 parent 23f7bd9 commit 72de1cd

File tree

5 files changed

+46
-29
lines changed

5 files changed

+46
-29
lines changed

pkg/controller/operator.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,9 @@ func (s *Operator) Run(ctx context.Context, controller *controllercmd.Controller
268268
return fmt.Errorf("unable to set initial cluster status: %v", err)
269269
}
270270

271-
scaController := sca.New(ctx, kubeClient.CoreV1(), configAggregator, insightsClient)
271+
scaController := sca.New(kubeClient.CoreV1(), configAggregator, insightsClient)
272272
statusReporter.AddSources(scaController)
273-
go scaController.Run()
273+
go scaController.Run(ctx)
274274

275275
clusterTransferController := clustertransfer.New(ctx, kubeClient.CoreV1(), configAggregator, insightsClient)
276276
statusReporter.AddSources(clusterTransferController)

pkg/insights/insightsclient/insightsclient.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import (
3333
const (
3434
responseBodyLogLen = 1024
3535
insightsReqId = "x-rh-insights-request-id"
36-
scaArchPayload = `{"type": "sca","arch": "x86_64"}`
36+
scaArchPayload = `{"type": "sca","arch": "%s"}`
3737
)
3838

3939
type Client struct {

pkg/insights/insightsclient/requests.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func (c *Client) RecvReport(ctx context.Context, endpoint string) (*http.Respons
180180
return nil, fmt.Errorf("report response status code: %d", resp.StatusCode)
181181
}
182182

183-
func (c *Client) RecvSCACerts(_ context.Context, endpoint string) ([]byte, error) {
183+
func (c *Client) RecvSCACerts(_ context.Context, endpoint string, architecture string) ([]byte, error) {
184184
cv, err := c.GetClusterVersion()
185185
if apierrors.IsNotFound(err) {
186186
return nil, ErrWaitingForVersion
@@ -192,14 +192,16 @@ func (c *Client) RecvSCACerts(_ context.Context, endpoint string) ([]byte, error
192192
if err != nil {
193193
return nil, err
194194
}
195-
req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewBuffer([]byte(scaArchPayload)))
195+
payload := fmt.Sprintf(scaArchPayload, architecture)
196+
req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewBuffer([]byte(payload)))
196197
if err != nil {
197198
return nil, err
198199
}
199200
req.Header.Set("Content-Type", "application/json")
200201
c.client.Transport = clientTransport(c.authorizer)
201202
authHeader := fmt.Sprintf("AccessToken %s:%s", cv.Spec.ClusterID, token)
202203
req.Header.Set("Authorization", authHeader)
204+
klog.Infof("Asking for SCA certificate for %s architecture", architecture)
203205

204206
resp, err := c.client.Do(req)
205207
if err != nil {

pkg/ocm/sca/sca.go

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"net/http"
8+
"runtime"
89
"strings"
910
"time"
1011

@@ -34,7 +35,6 @@ const (
3435
type Controller struct {
3536
controllerstatus.StatusController
3637
coreClient corev1client.CoreV1Interface
37-
ctx context.Context
3838
configurator configobserver.Interface
3939
client *insightsclient.Client
4040
}
@@ -48,33 +48,32 @@ type Response struct {
4848
}
4949

5050
// New creates new instance
51-
func New(ctx context.Context, coreClient corev1client.CoreV1Interface, configurator configobserver.Interface,
51+
func New(coreClient corev1client.CoreV1Interface, configurator configobserver.Interface,
5252
insightsClient *insightsclient.Client) *Controller {
5353
return &Controller{
5454
StatusController: controllerstatus.New(ControllerName),
5555
coreClient: coreClient,
56-
ctx: ctx,
5756
configurator: configurator,
5857
client: insightsClient,
5958
}
6059
}
6160

6261
// Run periodically queries the OCM API and update corresponding secret accordingly
63-
func (c *Controller) Run() {
62+
func (c *Controller) Run(ctx context.Context) {
6463
cfg := c.configurator.Config()
6564
endpoint := cfg.SCA.Endpoint
6665
interval := cfg.SCA.Interval
6766
disabled := cfg.SCA.Disabled
6867
configCh, cancel := c.configurator.ConfigChanged()
6968
defer cancel()
7069
if !disabled {
71-
c.requestDataAndCheckSecret(endpoint)
70+
c.requestDataAndCheckSecret(ctx, endpoint)
7271
}
7372
for {
7473
select {
7574
case <-time.After(interval):
7675
if !disabled {
77-
c.requestDataAndCheckSecret(endpoint)
76+
c.requestDataAndCheckSecret(ctx, endpoint)
7877
} else {
7978
msg := "Pulling of the SCA certs from the OCM API is disabled"
8079
klog.Warning(msg)
@@ -95,10 +94,11 @@ func (c *Controller) Run() {
9594
}
9695
}
9796

98-
func (c *Controller) requestDataAndCheckSecret(endpoint string) {
97+
func (c *Controller) requestDataAndCheckSecret(ctx context.Context, endpoint string) {
9998
klog.Infof("Pulling SCA certificates from %s. Next check is in %s", c.configurator.Config().SCA.Endpoint,
10099
c.configurator.Config().SCA.Interval)
101-
data, err := c.requestSCAWithExpBackoff(endpoint)
100+
101+
data, err := c.requestSCAWithExpBackoff(ctx, endpoint)
102102
if err != nil {
103103
httpErr, ok := err.(insightsclient.HttpError)
104104
errMsg := fmt.Sprintf("Failed to pull SCA certs from %s: %v", endpoint, err)
@@ -131,13 +131,13 @@ func (c *Controller) requestDataAndCheckSecret(endpoint string) {
131131
klog.Errorf("Unable to decode response: %v", err)
132132
return
133133
}
134-
135134
// check & update the secret here
136-
err = c.checkSecret(&ocmRes)
135+
err = c.checkSecret(ctx, &ocmRes)
137136
if err != nil {
138137
klog.Errorf("Error when checking the %s secret: %v", secretName, err)
139138
return
140139
}
140+
141141
klog.Infof("%s secret successfully updated", secretName)
142142
c.StatusController.UpdateStatus(controllerstatus.Summary{
143143
Operation: controllerstatus.PullingSCACerts,
@@ -151,12 +151,12 @@ func (c *Controller) requestDataAndCheckSecret(endpoint string) {
151151
// checkSecret checks "etc-pki-entitlement" secret in the "openshift-config-managed" namespace.
152152
// If the secret doesn't exist then it will create a new one.
153153
// If the secret already exist then it will update the data.
154-
func (c *Controller) checkSecret(ocmData *Response) error {
155-
scaSec, err := c.coreClient.Secrets(targetNamespaceName).Get(c.ctx, secretName, metav1.GetOptions{})
154+
func (c *Controller) checkSecret(ctx context.Context, ocmData *Response) error {
155+
scaSec, err := c.coreClient.Secrets(targetNamespaceName).Get(ctx, secretName, metav1.GetOptions{})
156156

157157
// if the secret doesn't exist then create one
158158
if errors.IsNotFound(err) {
159-
_, err = c.createSecret(ocmData)
159+
_, err = c.createSecret(ctx, ocmData)
160160
if err != nil {
161161
return err
162162
}
@@ -166,14 +166,14 @@ func (c *Controller) checkSecret(ocmData *Response) error {
166166
return err
167167
}
168168

169-
_, err = c.updateSecret(scaSec, ocmData)
169+
_, err = c.updateSecret(ctx, scaSec, ocmData)
170170
if err != nil {
171171
return err
172172
}
173173
return nil
174174
}
175175

176-
func (c *Controller) createSecret(ocmData *Response) (*v1.Secret, error) {
176+
func (c *Controller) createSecret(ctx context.Context, ocmData *Response) (*v1.Secret, error) {
177177
newSCA := &v1.Secret{
178178
ObjectMeta: metav1.ObjectMeta{
179179
Name: secretName,
@@ -185,41 +185,56 @@ func (c *Controller) createSecret(ocmData *Response) (*v1.Secret, error) {
185185
},
186186
Type: v1.SecretTypeOpaque,
187187
}
188-
cm, err := c.coreClient.Secrets(targetNamespaceName).Create(c.ctx, newSCA, metav1.CreateOptions{})
188+
cm, err := c.coreClient.Secrets(targetNamespaceName).Create(ctx, newSCA, metav1.CreateOptions{})
189189
if err != nil {
190190
return nil, err
191191
}
192192
return cm, nil
193193
}
194194

195195
// updateSecret updates provided secret with given data
196-
func (c *Controller) updateSecret(s *v1.Secret, ocmData *Response) (*v1.Secret, error) {
196+
func (c *Controller) updateSecret(ctx context.Context, s *v1.Secret, ocmData *Response) (*v1.Secret, error) {
197197
s.Data = map[string][]byte{
198198
entitlementAttrName: []byte(ocmData.Cert),
199199
entitlementKeyAttrName: []byte(ocmData.Key),
200200
}
201-
s, err := c.coreClient.Secrets(s.Namespace).Update(c.ctx, s, metav1.UpdateOptions{})
201+
s, err := c.coreClient.Secrets(s.Namespace).Update(ctx, s, metav1.UpdateOptions{})
202202
if err != nil {
203203
return nil, err
204204
}
205205
return s, nil
206206
}
207207

208+
// getArch check the value of GOARCH and return a valid representation for
209+
// OCM certificates API
210+
func getArch() string {
211+
validArchs := map[string]string{
212+
"amd64": "x86_64",
213+
"i386": "x86",
214+
}
215+
216+
if translation, ok := validArchs[runtime.GOARCH]; ok {
217+
return translation
218+
}
219+
return runtime.GOARCH
220+
}
221+
208222
// requestSCAWithExpBackoff queries OCM API with exponential backoff.
209223
// Returns HttpError (see insightsclient.go) in case of any HTTP error response from OCM API.
210224
// The exponential backoff is applied only for HTTP errors >= 500.
211-
func (c *Controller) requestSCAWithExpBackoff(endpoint string) ([]byte, error) {
225+
func (c *Controller) requestSCAWithExpBackoff(ctx context.Context, endpoint string) ([]byte, error) {
212226
bo := wait.Backoff{
213227
Duration: c.configurator.Config().SCA.Interval / 32, // 15 min by default
214228
Factor: 2,
215229
Jitter: 0,
216230
Steps: ocm.FailureCountThreshold,
217231
Cap: c.configurator.Config().SCA.Interval,
218232
}
233+
219234
var data []byte
220235
err := wait.ExponentialBackoff(bo, func() (bool, error) {
221236
var err error
222-
data, err = c.client.RecvSCACerts(c.ctx, endpoint)
237+
data, err = c.client.RecvSCACerts(ctx, endpoint, getArch())
223238
if err != nil {
224239
// don't try again in case it's not an HTTP error - it could mean we're in disconnected env
225240
if !insightsclient.IsHttpError(err) {

pkg/ocm/sca/sca_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ var (
1919
func Test_SCAController_SecretIsCreated(t *testing.T) {
2020
kube := kubefake.NewSimpleClientset()
2121
coreClient := kube.CoreV1()
22-
scaController := New(context.TODO(), coreClient, nil, nil)
22+
scaController := New(coreClient, nil, nil)
2323

2424
testRes := &Response{
2525
Key: "secret key",
2626
Cert: "secret cert",
2727
}
28-
err := scaController.checkSecret(testRes)
28+
err := scaController.checkSecret(context.Background(), testRes)
2929
assert.NoError(t, err, "failed to check the secret")
3030

3131
testSecret, err := coreClient.Secrets(targetNamespaceName).Get(context.Background(), secretName, metav1.GetOptions{})
@@ -52,12 +52,12 @@ func Test_SCAController_SecretIsUpdated(t *testing.T) {
5252
}
5353
_, err := coreClient.Secrets(targetNamespaceName).Create(context.Background(), existingSec, metav1.CreateOptions{})
5454
assert.NoError(t, err)
55-
scaController := New(context.TODO(), coreClient, nil, nil)
55+
scaController := New(coreClient, nil, nil)
5656
testRes := &Response{
5757
Key: "new secret testing key",
5858
Cert: "new secret testing cert",
5959
}
60-
err = scaController.checkSecret(testRes)
60+
err = scaController.checkSecret(context.Background(), testRes)
6161
assert.NoError(t, err, "failed to check the secret")
6262

6363
testSecret, err := coreClient.Secrets(targetNamespaceName).Get(context.Background(), secretName, metav1.GetOptions{})

0 commit comments

Comments
 (0)