Skip to content

Commit 7d015d9

Browse files
authored
sriov: SriovNetwork switched to runtime api client (rh-ecosystem-edge#573)
Co-authored-by: nkononov <[email protected]>
1 parent 2312c30 commit 7d015d9

File tree

5 files changed

+116
-47
lines changed

5 files changed

+116
-47
lines changed

pkg/clients/clients.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,8 +523,6 @@ func GetModifiableTestClients(tcp TestClientParams) (*Settings, *fakeRuntimeClie
523523
case *velerov1.BackupStorageLocation:
524524
veleroClientObjects = append(veleroClientObjects, v)
525525
// SrIov Client Objects
526-
case *srIovV1.SriovNetwork:
527-
srIovObjects = append(srIovObjects, v)
528526
case *srIovV1.SriovNetworkNodePolicy:
529527
srIovObjects = append(srIovObjects, v)
530528
case *srIovV1.SriovOperatorConfig:

pkg/sriov/list_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import (
99
"github.com/stretchr/testify/assert"
1010
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1111
"k8s.io/apimachinery/pkg/runtime"
12+
"sigs.k8s.io/controller-runtime/pkg/client"
1213
)
1314

1415
func TestNetworkList(t *testing.T) {
1516
testCases := []struct {
1617
testNetwork []*NetworkBuilder
1718
nsName string
18-
listOptions []metav1.ListOptions
19+
listOptions []client.ListOptions
1920
expectedError error
2021
client bool
2122
}{
@@ -34,13 +35,13 @@ func TestNetworkList(t *testing.T) {
3435
{
3536
testNetwork: []*NetworkBuilder{buildValidSriovNetworkTestBuilder(buildTestClientWithDummyObject())},
3637
nsName: "testnamespace",
37-
listOptions: []metav1.ListOptions{{LabelSelector: "test"}},
38+
listOptions: []client.ListOptions{{Continue: "test"}},
3839
client: true,
3940
},
4041
{
4142
testNetwork: []*NetworkBuilder{buildValidSriovNetworkTestBuilder(buildTestClientWithDummyObject())},
4243
nsName: "testnamespace",
43-
listOptions: []metav1.ListOptions{{LabelSelector: "test"}, {Continue: "true"}},
44+
listOptions: []client.ListOptions{{Namespace: "test"}, {Continue: "true"}},
4445
expectedError: fmt.Errorf("error: more than one ListOptions was passed"),
4546
client: true,
4647
},
@@ -56,7 +57,8 @@ func TestNetworkList(t *testing.T) {
5657

5758
if testCase.client {
5859
testSettings = clients.GetTestClients(clients.TestClientParams{
59-
K8sMockObjects: buildDummySrIovNetworkObject(),
60+
K8sMockObjects: buildDummySrIovNetworkObject(),
61+
SchemeAttachers: testSchemes,
6062
})
6163
}
6264

@@ -74,7 +76,7 @@ func TestNetworkCleanAllNetworksByTargetNamespace(t *testing.T) {
7476
testNetwork []*NetworkBuilder
7577
operatorNsName string
7678
targetNsName string
77-
listOptions []metav1.ListOptions
79+
listOptions []client.ListOptions
7880
client bool
7981
expectedError error
8082
}{
@@ -102,14 +104,14 @@ func TestNetworkCleanAllNetworksByTargetNamespace(t *testing.T) {
102104
testNetwork: []*NetworkBuilder{buildValidSriovNetworkTestBuilder(buildTestClientWithDummyObject())},
103105
operatorNsName: "testnamespace",
104106
targetNsName: "targetns",
105-
listOptions: []metav1.ListOptions{{AllowWatchBookmarks: false}},
107+
listOptions: []client.ListOptions{{Namespace: "test"}},
106108
client: true,
107109
},
108110
{
109111
testNetwork: []*NetworkBuilder{buildValidSriovNetworkTestBuilder(buildTestClientWithDummyObject())},
110112
operatorNsName: "testnamespace",
111113
targetNsName: "targetns",
112-
listOptions: []metav1.ListOptions{{LabelSelector: "test"}, {Continue: "true"}},
114+
listOptions: []client.ListOptions{{Namespace: "test"}, {Continue: "true"}},
113115
expectedError: fmt.Errorf("error: more than one ListOptions was passed"),
114116
client: true,
115117
},

pkg/sriov/network.go

Lines changed: 81 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ import (
66
"time"
77

88
"github.com/golang/glog"
9-
clientSrIov "github.com/k8snetworkplumbingwg/sriov-network-operator/pkg/client/clientset/versioned"
109
"github.com/openshift-kni/eco-goinfra/pkg/msg"
11-
1210
k8serrors "k8s.io/apimachinery/pkg/api/errors"
1311
"k8s.io/apimachinery/pkg/runtime/schema"
1412
"k8s.io/apimachinery/pkg/util/wait"
13+
runtimeClient "sigs.k8s.io/controller-runtime/pkg/client"
1514

1615
srIovV1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1"
1716
"github.com/openshift-kni/eco-goinfra/pkg/clients"
@@ -31,7 +30,7 @@ type NetworkBuilder struct {
3130
// object is created.
3231
errorMsg string
3332
// apiClient opens api connection to the cluster.
34-
apiClient clientSrIov.Interface
33+
apiClient runtimeClient.Client
3534
}
3635

3736
// NetworkAdditionalOptions additional options for SriovNetwork object.
@@ -40,8 +39,21 @@ type NetworkAdditionalOptions func(builder *NetworkBuilder) (*NetworkBuilder, er
4039
// NewNetworkBuilder creates new instance of Builder.
4140
func NewNetworkBuilder(
4241
apiClient *clients.Settings, name, nsname, targetNsname, resName string) *NetworkBuilder {
42+
if apiClient == nil {
43+
glog.V(100).Infof("The apiClient cannot be nil")
44+
45+
return nil
46+
}
47+
48+
err := apiClient.AttachScheme(srIovV1.AddToScheme)
49+
if err != nil {
50+
glog.V(100).Infof("Failed to add sriovv1 scheme to client schemes")
51+
52+
return nil
53+
}
54+
4355
builder := NetworkBuilder{
44-
apiClient: apiClient.ClientSrIov,
56+
apiClient: apiClient.Client,
4557
Definition: &srIovV1.SriovNetwork{
4658
ObjectMeta: metav1.ObjectMeta{
4759
Name: name,
@@ -292,8 +304,15 @@ func PullNetwork(apiClient *clients.Settings, name, nsname string) (*NetworkBuil
292304
return nil, fmt.Errorf("sriovnetwork 'apiClient' cannot be empty")
293305
}
294306

307+
err := apiClient.AttachScheme(srIovV1.AddToScheme)
308+
if err != nil {
309+
glog.V(100).Infof("Failed to add sriovv1 scheme to client schemes")
310+
311+
return nil, err
312+
}
313+
295314
builder := NetworkBuilder{
296-
apiClient: apiClient.ClientSrIov,
315+
apiClient: apiClient.Client,
297316
Definition: &srIovV1.SriovNetwork{
298317
ObjectMeta: metav1.ObjectMeta{
299318
Name: name,
@@ -323,23 +342,50 @@ func PullNetwork(apiClient *clients.Settings, name, nsname string) (*NetworkBuil
323342
return &builder, nil
324343
}
325344

345+
// Get returns CatalogSource object if found.
346+
func (builder *NetworkBuilder) Get() (*srIovV1.SriovNetwork, error) {
347+
if valid, err := builder.validate(); !valid {
348+
return nil, err
349+
}
350+
351+
glog.V(100).Infof(
352+
"Collecting SriovNetwork object %s in namespace %s",
353+
builder.Definition.Name, builder.Definition.Namespace)
354+
355+
network := &srIovV1.SriovNetwork{}
356+
err := builder.apiClient.Get(context.TODO(),
357+
runtimeClient.ObjectKey{Name: builder.Definition.Name, Namespace: builder.Definition.Namespace},
358+
network)
359+
360+
if err != nil {
361+
glog.V(100).Infof(
362+
"SriovNetwork object %s does not exist in namespace %s",
363+
builder.Definition.Name, builder.Definition.Namespace)
364+
365+
return nil, err
366+
}
367+
368+
return network, nil
369+
}
370+
326371
// Create generates SrIovNetwork in a cluster and stores the created object in struct.
327372
func (builder *NetworkBuilder) Create() (*NetworkBuilder, error) {
328373
if valid, err := builder.validate(); !valid {
329374
return builder, err
330375
}
331376

332377
if !builder.Exists() {
333-
var err error
334-
builder.Object, err = builder.apiClient.SriovnetworkV1().SriovNetworks(builder.Definition.Namespace).Create(
335-
context.TODO(), builder.Definition, metav1.CreateOptions{},
336-
)
378+
err := builder.apiClient.Create(context.TODO(), builder.Definition)
337379

338380
if err != nil {
381+
glog.V(100).Infof("Failed to create SriovNetwork")
382+
339383
return nil, err
340384
}
341385
}
342386

387+
builder.Object = builder.Definition
388+
343389
return builder, nil
344390
}
345391

@@ -350,11 +396,12 @@ func (builder *NetworkBuilder) Delete() error {
350396
}
351397

352398
if !builder.Exists() {
399+
glog.V(100).Infof("SriovNetwork cannot be deleted because it does not exist")
400+
353401
return nil
354402
}
355403

356-
err := builder.apiClient.SriovnetworkV1().SriovNetworks(builder.Definition.Namespace).Delete(
357-
context.TODO(), builder.Object.Name, metav1.DeleteOptions{})
404+
err := builder.apiClient.Delete(context.TODO(), builder.Definition)
358405

359406
if err != nil {
360407
return err
@@ -394,8 +441,8 @@ func (builder *NetworkBuilder) WaitUntilDeleted(timeout time.Duration) error {
394441

395442
return wait.PollUntilContextTimeout(
396443
context.TODO(), time.Second, timeout, true, func(ctx context.Context) (bool, error) {
397-
_, err := builder.apiClient.SriovnetworkV1().SriovNetworks(builder.Definition.Namespace).
398-
Get(context.TODO(), builder.Definition.Name, metav1.GetOptions{})
444+
_, err := builder.Get()
445+
399446
if err == nil {
400447
glog.V(100).Infof("SrIovNetwork %s/%s still present", builder.Definition.Name, builder.Definition.Namespace)
401448

@@ -420,9 +467,12 @@ func (builder *NetworkBuilder) Exists() bool {
420467
return false
421468
}
422469

470+
glog.V(100).Infof(
471+
"Checking if SriovNetwork %s exists",
472+
builder.Definition.Name)
473+
423474
var err error
424-
builder.Object, err = builder.apiClient.SriovnetworkV1().SriovNetworks(builder.Definition.Namespace).Get(
425-
context.TODO(), builder.Definition.Name, metav1.GetOptions{})
475+
builder.Object, err = builder.Get()
426476

427477
return err == nil || !k8serrors.IsNotFound(err)
428478
}
@@ -437,26 +487,28 @@ func (builder *NetworkBuilder) Update(force bool) (*NetworkBuilder, error) {
437487
builder.Definition.Name, builder.Definition.Namespace,
438488
)
439489

440-
var err error
441-
builder.Object, err = builder.apiClient.SriovnetworkV1().SriovNetworks(builder.Definition.Namespace).
442-
Update(context.TODO(), builder.Definition, metav1.UpdateOptions{})
490+
if !builder.Exists() {
491+
return nil, fmt.Errorf("failed to update SriovNetwork, object does not exist on cluster")
492+
}
443493

444-
if err != nil {
445-
if force {
446-
glog.V(100).Infof(
447-
msg.FailToUpdateNotification("SrIovNetwork", builder.Definition.Name, builder.Definition.Namespace))
494+
err := builder.apiClient.Update(context.TODO(), builder.Definition)
448495

449-
err = builder.Delete()
496+
if err == nil {
497+
builder.Object = builder.Definition
498+
} else if force {
499+
glog.V(100).Infof(
500+
msg.FailToUpdateNotification("SrIovNetwork", builder.Definition.Name, builder.Definition.Namespace))
450501

451-
if err != nil {
452-
glog.V(100).Infof(
453-
msg.FailToUpdateError("SrIovNetwork", builder.Definition.Name, builder.Definition.Namespace))
502+
err = builder.Delete()
454503

455-
return nil, err
456-
}
504+
if err != nil {
505+
glog.V(100).Infof(
506+
msg.FailToUpdateError("SrIovNetwork", builder.Definition.Name, builder.Definition.Namespace))
457507

458-
return builder.Create()
508+
return nil, err
459509
}
510+
511+
return builder.Create()
460512
}
461513

462514
return builder, err

pkg/sriov/network_test.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ var (
2222
defaultNetResName = "resname"
2323
)
2424

25+
var (
26+
testSchemes = []clients.SchemeAttacher{
27+
srIovV1.AddToScheme,
28+
}
29+
)
30+
2531
//nolint:funlen
2632
func TestPullNetwork(t *testing.T) {
2733
generateNetwork := func(name, namespace string) *srIovV1.SriovNetwork {
@@ -97,7 +103,8 @@ func TestPullNetwork(t *testing.T) {
97103

98104
if testCase.client {
99105
testSettings = clients.GetTestClients(clients.TestClientParams{
100-
K8sMockObjects: runtimeObjects,
106+
K8sMockObjects: runtimeObjects,
107+
SchemeAttachers: testSchemes,
101108
})
102109
}
103110

@@ -646,6 +653,7 @@ func TestUpdate(t *testing.T) {
646653
assert.Equal(t, "", testCase.testNetwork.Definition.Spec.IPAM)
647654
assert.Nil(t, nil, testCase.testNetwork.Object)
648655
testCase.testNetwork.WithStaticIpam()
656+
testCase.testNetwork.Definition.ObjectMeta.ResourceVersion = "999"
649657
netBuilder, err := testCase.testNetwork.Update(false)
650658
assert.Equal(t, testCase.expectedError, err)
651659
assert.Equal(t, `{ "type": "static" }`, testCase.testNetwork.Object.Spec.IPAM)
@@ -667,7 +675,8 @@ func buildInvalidSrIovNetworkTestBuilder(apiClient *clients.Settings) *NetworkBu
667675

668676
func buildTestClientWithDummyObject() *clients.Settings {
669677
return clients.GetTestClients(clients.TestClientParams{
670-
K8sMockObjects: buildDummySrIovNetworkObject(),
678+
K8sMockObjects: buildDummySrIovNetworkObject(),
679+
SchemeAttachers: testSchemes,
671680
})
672681
}
673682

pkg/sriov/networklist.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,33 @@ import (
55
"fmt"
66

77
"github.com/golang/glog"
8+
srIovV1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1"
89
"github.com/openshift-kni/eco-goinfra/pkg/clients"
9-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"sigs.k8s.io/controller-runtime/pkg/client"
1011
)
1112

1213
// List returns sriov networks in the given namespace.
13-
func List(apiClient *clients.Settings, nsname string, options ...metav1.ListOptions) ([]*NetworkBuilder, error) {
14+
func List(apiClient *clients.Settings, nsname string, options ...client.ListOptions) ([]*NetworkBuilder, error) {
1415
if apiClient == nil {
1516
glog.V(100).Infof("sriov network 'apiClient' parameter can not be empty")
1617

1718
return nil, fmt.Errorf("failed to list sriov networks, 'apiClient' parameter is empty")
1819
}
1920

21+
err := apiClient.AttachScheme(srIovV1.AddToScheme)
22+
if err != nil {
23+
glog.V(100).Infof("Failed to add oplmV1alpha1 scheme to client schemes")
24+
25+
return nil, err
26+
}
27+
2028
if nsname == "" {
2129
glog.V(100).Infof("sriov network 'nsname' parameter can not be empty")
2230

2331
return nil, fmt.Errorf("failed to list sriov networks, 'nsname' parameter is empty")
2432
}
2533

26-
passedOptions := metav1.ListOptions{}
34+
passedOptions := client.ListOptions{}
2735
logMessage := fmt.Sprintf("Listing sriov networks in the namespace %s", nsname)
2836

2937
if len(options) > 1 {
@@ -39,8 +47,8 @@ func List(apiClient *clients.Settings, nsname string, options ...metav1.ListOpti
3947

4048
glog.V(100).Infof(logMessage)
4149

42-
networkList, err := apiClient.ClientSrIov.SriovnetworkV1().
43-
SriovNetworks(nsname).List(context.TODO(), passedOptions)
50+
networkList := new(srIovV1.SriovNetworkList)
51+
err = apiClient.List(context.TODO(), networkList, &passedOptions)
4452

4553
if err != nil {
4654
glog.V(100).Infof("Failed to list sriov networks in the namespace %s due to %s", nsname, err.Error())
@@ -53,7 +61,7 @@ func List(apiClient *clients.Settings, nsname string, options ...metav1.ListOpti
5361
for _, runningNetwork := range networkList.Items {
5462
copiedNetwork := runningNetwork
5563
networkBuilder := &NetworkBuilder{
56-
apiClient: apiClient.ClientSrIov,
64+
apiClient: apiClient.Client,
5765
Object: &copiedNetwork,
5866
Definition: &copiedNetwork,
5967
}
@@ -69,7 +77,7 @@ func CleanAllNetworksByTargetNamespace(
6977
apiClient *clients.Settings,
7078
operatornsname string,
7179
targetnsname string,
72-
options ...metav1.ListOptions) error {
80+
options ...client.ListOptions) error {
7381
glog.V(100).Infof("Cleaning up sriov networks in the %s namespace with %s NetworkNamespace spec",
7482
operatornsname, targetnsname)
7583

0 commit comments

Comments
 (0)