Skip to content

Commit 133b79b

Browse files
author
Jan Wozniak
committed
oc import-image: poll on IS to respect resourceNames RBAC
`watch` doesn't work with RBAC `resourceNames` as well as `get`. Changing the `waitForImport` to poll a `get` instead. fixes #13214
1 parent 89d5bfb commit 133b79b

File tree

1 file changed

+18
-36
lines changed

1 file changed

+18
-36
lines changed

pkg/oc/cli/cmd/importimage.go

+18-36
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import (
1010

1111
"k8s.io/apimachinery/pkg/api/errors"
1212
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13-
"k8s.io/apimachinery/pkg/fields"
14-
"k8s.io/apimachinery/pkg/watch"
13+
"k8s.io/apimachinery/pkg/util/wait"
1514
"k8s.io/kubernetes/pkg/api/legacyscheme"
1615
kapi "k8s.io/kubernetes/pkg/apis/core"
1716
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
@@ -299,42 +298,25 @@ func (e importError) Error() string {
299298
}
300299

301300
func (o *ImportImageOptions) waitForImport(resourceVersion string) (*imageapi.ImageStream, error) {
302-
streamWatch, err := o.isClient.Watch(metav1.ListOptions{FieldSelector: fields.OneTermEqualSelector("metadata.name", o.Name).String(), ResourceVersion: resourceVersion})
303-
if err != nil {
304-
return nil, err
305-
}
306-
defer streamWatch.Stop()
307-
308-
for {
309-
select {
310-
case event, ok := <-streamWatch.ResultChan():
311-
if !ok {
312-
return nil, fmt.Errorf("image stream watch ended prematurely")
313-
}
314-
315-
switch event.Type {
316-
case watch.Modified:
317-
s, ok := event.Object.(*imageapi.ImageStream)
318-
if !ok {
319-
continue
320-
}
321-
annotation, ok := s.Annotations[imageapi.DockerImageRepositoryCheckAnnotation]
322-
if !ok {
323-
continue
324-
}
325-
326-
if _, err := time.Parse(time.RFC3339, annotation); err == nil {
327-
return s, nil
328-
}
329-
return nil, importError{annotation}
301+
var is *imageapi.ImageStream
302+
err := wait.Poll(1*time.Second, 60*time.Second, func() (bool, error) {
303+
var err error
304+
is, err = o.isClient.Get(o.Name, metav1.GetOptions{})
305+
if err != nil {
306+
return false, err
307+
}
308+
annotation, ok := is.Annotations[imageapi.DockerImageRepositoryCheckAnnotation]
309+
if !ok {
310+
return false, nil
311+
}
330312

331-
case watch.Deleted:
332-
return nil, fmt.Errorf("the image stream was deleted")
333-
case watch.Error:
334-
return nil, fmt.Errorf("error watching image stream")
335-
}
313+
if _, err := time.Parse(time.RFC3339, annotation); err != nil {
314+
return false, importError{annotation}
336315
}
337-
}
316+
317+
return true, nil
318+
})
319+
return is, err
338320
}
339321

340322
func (o *ImportImageOptions) createImageImport() (*imageapi.ImageStream, *imageapi.ImageStreamImport, error) {

0 commit comments

Comments
 (0)