From 5e6d9dedbbfcfac5f2953b7bdfb1b9efcb82fd58 Mon Sep 17 00:00:00 2001 From: Yuting Peng Date: Thu, 25 Apr 2024 10:54:31 -0700 Subject: [PATCH 1/3] test secondary vnic --- pkg/cloudprovider/providers/oci/instances.go | 24 +++++++++ .../providers/oci/instances_test.go | 4 ++ pkg/csi/driver/bv_controller_test.go | 4 ++ pkg/oci/client/compute.go | 52 +++++++++++++++++++ pkg/volume/provisioner/block/block_test.go | 4 ++ pkg/volume/provisioner/fss/fss_test.go | 4 ++ 6 files changed, 92 insertions(+) diff --git a/pkg/cloudprovider/providers/oci/instances.go b/pkg/cloudprovider/providers/oci/instances.go index 1c2e5c0417..f2df485e12 100644 --- a/pkg/cloudprovider/providers/oci/instances.go +++ b/pkg/cloudprovider/providers/oci/instances.go @@ -97,6 +97,30 @@ func (cp *CloudProvider) extractNodeAddresses(ctx context.Context, instanceID st addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) } + secondaryVnic, err := cp.client.Compute().GetSecondaryVNICForInstance(ctx, compartmentID, instanceID) + if err != nil { + return nil, errors.Wrap(err, "GetSecondaryVNICForInstance") + } + + if secondaryVnic == nil { + return addresses, nil + } + + if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PrivateIp != nil && *secondaryVnic.PrivateIp != "" { + ip := net.ParseIP(*secondaryVnic.PrivateIp) + if ip == nil { + return nil, fmt.Errorf("instance has invalid private address: %q", *secondaryVnic.PrivateIp) + } + addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: ip.String()}) + } + + if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PublicIp != nil && *secondaryVnic.PublicIp != "" { + ip := net.ParseIP(*secondaryVnic.PublicIp) + if ip == nil { + return nil, errors.Errorf("instance has invalid public address: %q", *secondaryVnic.PublicIp) + } + addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) + } // Changing this can have wide reaching impact. // // if vnic.HostnameLabel != nil && *vnic.HostnameLabel != "" { diff --git a/pkg/cloudprovider/providers/oci/instances_test.go b/pkg/cloudprovider/providers/oci/instances_test.go index c1a7554c6c..3246598767 100644 --- a/pkg/cloudprovider/providers/oci/instances_test.go +++ b/pkg/cloudprovider/providers/oci/instances_test.go @@ -336,6 +336,10 @@ func (MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compartm return instanceVnics[instanceID], nil } +func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { + return instanceVnics[instanceID], nil +} + func (MockComputeClient) FindVolumeAttachment(ctx context.Context, compartmentID, volumeID string) (core.VolumeAttachment, error) { return nil, nil } diff --git a/pkg/csi/driver/bv_controller_test.go b/pkg/csi/driver/bv_controller_test.go index aebb3a8473..5dd8c42443 100644 --- a/pkg/csi/driver/bv_controller_test.go +++ b/pkg/csi/driver/bv_controller_test.go @@ -288,6 +288,10 @@ func (c *MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compa return nil, nil } +func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { + return nil, nil +} + func (c *MockComputeClient) FindVolumeAttachment(ctx context.Context, compartmentID, volumeID string) (core.VolumeAttachment, error) { return nil, nil } diff --git a/pkg/oci/client/compute.go b/pkg/oci/client/compute.go index e34e311bbc..1aeb1db645 100644 --- a/pkg/oci/client/compute.go +++ b/pkg/oci/client/compute.go @@ -16,6 +16,7 @@ package client import ( "context" + "log" "strings" "github.com/oracle/oci-go-sdk/v65/core" @@ -33,6 +34,8 @@ type ComputeInterface interface { GetPrimaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) + GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) + VolumeAttachmentInterface } @@ -151,6 +154,55 @@ func (c *client) GetPrimaryVNICForInstance(ctx context.Context, compartmentID, i return nil, errors.WithStack(errNotFound) } +func (c *client) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { + logger := c.logger.With("instanceID", instanceID, "compartmentID", compartmentID) + + var page *string + for { + resp, err := c.listVNICAttachments(ctx, core.ListVnicAttachmentsRequest{ + InstanceId: &instanceID, + CompartmentId: &compartmentID, + Page: page, + RequestMetadata: c.requestMetadata, + }) + + if err != nil { + return nil, err + } + + for _, attachment := range resp.Items { + if attachment.LifecycleState != core.VnicAttachmentLifecycleStateAttached { + logger.With("vnicAttachmentID", *attachment.Id).Info("VNIC attachment is not in attached state") + log.Println(logger) + continue + } + + if attachment.VnicId == nil { + // Should never happen but lets be extra cautious as field is non-mandatory in OCI API. + logger.With("vnicAttachmentID", *attachment.Id).Error("VNIC attachment is attached but has no VNIC ID") + log.Println(logger) + continue + } + + // TODO(apryde): Cache map[instanceID]primaryVNICID. + vnic, err := c.GetVNIC(ctx, *attachment.VnicId) + if err != nil { + return nil, err + } + + if !*vnic.IsPrimary { + return vnic, nil + } + } + + if page = resp.OpcNextPage; resp.OpcNextPage == nil { + break + } + } + + return nil, errors.WithStack(errNotFound) +} + func (c *client) GetInstanceByNodeName(ctx context.Context, compartmentID, vcnID, nodeName string) (*core.Instance, error) { // First try lookup by display name. instance, err := c.getInstanceByDisplayName(ctx, compartmentID, nodeName) diff --git a/pkg/volume/provisioner/block/block_test.go b/pkg/volume/provisioner/block/block_test.go index 8d9d21eb08..eb7969847c 100644 --- a/pkg/volume/provisioner/block/block_test.go +++ b/pkg/volume/provisioner/block/block_test.go @@ -210,6 +210,10 @@ func (c *MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compa return nil, nil } +func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { + return nil, nil +} + func (c *MockComputeClient) FindVolumeAttachment(ctx context.Context, compartmentID, volumeID string) (core.VolumeAttachment, error) { return nil, nil } diff --git a/pkg/volume/provisioner/fss/fss_test.go b/pkg/volume/provisioner/fss/fss_test.go index 1f571f871a..2224dcc1a9 100644 --- a/pkg/volume/provisioner/fss/fss_test.go +++ b/pkg/volume/provisioner/fss/fss_test.go @@ -209,6 +209,10 @@ func (c *MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compa return nil, nil } +func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { + return nil, nil +} + func (c *MockComputeClient) FindVolumeAttachment(ctx context.Context, compartmentID, volumeID string) (core.VolumeAttachment, error) { return nil, nil } From 0f9ce4e17e8c11f04615e52740e4804ff1f31ac4 Mon Sep 17 00:00:00 2001 From: yutpeng Date: Thu, 18 Jul 2024 14:09:32 -0700 Subject: [PATCH 2/3] use label --- pkg/cloudprovider/providers/oci/instances.go | 71 ++++++++++++++----- .../providers/oci/node_info_controller.go | 7 +- 2 files changed, 57 insertions(+), 21 deletions(-) diff --git a/pkg/cloudprovider/providers/oci/instances.go b/pkg/cloudprovider/providers/oci/instances.go index f2df485e12..94d4c3502e 100644 --- a/pkg/cloudprovider/providers/oci/instances.go +++ b/pkg/cloudprovider/providers/oci/instances.go @@ -97,29 +97,32 @@ func (cp *CloudProvider) extractNodeAddresses(ctx context.Context, instanceID st addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) } - secondaryVnic, err := cp.client.Compute().GetSecondaryVNICForInstance(ctx, compartmentID, instanceID) - if err != nil { - return nil, errors.Wrap(err, "GetSecondaryVNICForInstance") - } + useSecondaryVnic, err := cp.checkOpenShiftNodesSecondaryVnicByInstance(instanceID) + if useSecondaryVnic { + secondaryVnic, err := cp.client.Compute().GetSecondaryVNICForInstance(ctx, compartmentID, instanceID) + if err != nil { + return nil, errors.Wrap(err, "GetSecondaryVNICForInstance") + } - if secondaryVnic == nil { - return addresses, nil - } + if secondaryVnic == nil { + return addresses, nil + } - if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PrivateIp != nil && *secondaryVnic.PrivateIp != "" { - ip := net.ParseIP(*secondaryVnic.PrivateIp) - if ip == nil { - return nil, fmt.Errorf("instance has invalid private address: %q", *secondaryVnic.PrivateIp) + if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PrivateIp != nil && *secondaryVnic.PrivateIp != "" { + ip := net.ParseIP(*secondaryVnic.PrivateIp) + if ip == nil { + return nil, fmt.Errorf("instance has invalid private address: %q", *secondaryVnic.PrivateIp) + } + addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: ip.String()}) } - addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: ip.String()}) - } - if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PublicIp != nil && *secondaryVnic.PublicIp != "" { - ip := net.ParseIP(*secondaryVnic.PublicIp) - if ip == nil { - return nil, errors.Errorf("instance has invalid public address: %q", *secondaryVnic.PublicIp) + if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PublicIp != nil && *secondaryVnic.PublicIp != "" { + ip := net.ParseIP(*secondaryVnic.PublicIp) + if ip == nil { + return nil, errors.Errorf("instance has invalid public address: %q", *secondaryVnic.PublicIp) + } + addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) } - addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) } // Changing this can have wide reaching impact. // @@ -307,3 +310,35 @@ func (cp *CloudProvider) getCompartmentIDByNodeName(nodeName string) (string, er cp.logger.Debug("CompartmentID annotation is not present") return "", errors.New("compartmentID annotation missing in the node. Would retry") } + +func (cp *CloudProvider) checkOpenShiftNodesSecondaryVnicByInstance(instanceID string) (bool, error) { + var SecondaryVnicUsageInstances = []string{"BM.Standard3.64"} + nodeList, err := cp.NodeLister.List(labels.Everything()) + if err != nil { + return false, errors.Wrap(err, "error listing all the nodes using node informer") + } + for _, node := range nodeList { + providerID, err := MapProviderIDToInstanceID(node.Spec.ProviderID) + if err != nil { + return false, errors.New("Failed to map providerID to instanceID.") + } + if providerID == instanceID { + if _, ok := node.Labels[OpenShiftNodeIdentifierLabel]; ok { + if instanceType, ok := node.Labels[api.LabelInstanceTypeStable]; ok && contains(SecondaryVnicUsageInstances, instanceType) { + return true, nil + } + } + } + } + return false, errors.New("Failed to check OpenShift node using node lables. Returning false") +} + +// contains is a utility method to check if a string is part of a slice +func contains(s []string, e string) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} diff --git a/pkg/cloudprovider/providers/oci/node_info_controller.go b/pkg/cloudprovider/providers/oci/node_info_controller.go index 4b5438fcc0..75073536d2 100644 --- a/pkg/cloudprovider/providers/oci/node_info_controller.go +++ b/pkg/cloudprovider/providers/oci/node_info_controller.go @@ -41,9 +41,10 @@ import ( // metadata labeling for placement info const ( - FaultDomainLabel = "oci.oraclecloud.com/fault-domain" - CompartmentIDAnnotation = "oci.oraclecloud.com/compartment-id" - timeout = 10 * time.Second + FaultDomainLabel = "oci.oraclecloud.com/fault-domain" + CompartmentIDAnnotation = "oci.oraclecloud.com/compartment-id" + OpenShiftNodeIdentifierLabel = "node.openshift.io/os_id" + timeout = 10 * time.Second ) // NodeInfoController helps compute workers in the cluster From 461e4ac78747138dbc56f49da68e2c2ec36185c4 Mon Sep 17 00:00:00 2001 From: yutpeng Date: Thu, 18 Jul 2024 14:12:26 -0700 Subject: [PATCH 3/3] Add Tags to OpenShift nodes & iSCSI usage --- pkg/cloudprovider/providers/oci/instances.go | 88 +++++++++++-------- .../providers/oci/instances_test.go | 4 +- .../providers/oci/node_info_controller.go | 7 +- pkg/csi/driver/bv_controller_test.go | 2 +- pkg/oci/client/compute.go | 10 +-- pkg/volume/provisioner/block/block_test.go | 2 +- pkg/volume/provisioner/fss/fss_test.go | 2 +- 7 files changed, 63 insertions(+), 52 deletions(-) diff --git a/pkg/cloudprovider/providers/oci/instances.go b/pkg/cloudprovider/providers/oci/instances.go index 3f417daaa5..07bdfc5fb0 100644 --- a/pkg/cloudprovider/providers/oci/instances.go +++ b/pkg/cloudprovider/providers/oci/instances.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "net" + "strings" "github.com/oracle/oci-go-sdk/v65/core" "k8s.io/apimachinery/pkg/labels" @@ -29,6 +30,12 @@ import ( cloudprovider "k8s.io/cloud-provider" ) +const ( + OpenShiftTagNamesapcePrefix = "openshift-" + OpenShiftBootVolumeType = "boot-volume-type" + OpenShiftBootVolumeISCSI = "ISCSI" +) + var _ cloudprovider.Instances = &CloudProvider{} // mapNodeNameToInstanceName maps a kube NodeName to a OCI instance display @@ -97,33 +104,38 @@ func (cp *CloudProvider) extractNodeAddresses(ctx context.Context, instanceID st addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) } - useSecondaryVnic, err := cp.checkOpenShiftNodesSecondaryVnicByInstance(instanceID) - if useSecondaryVnic { - secondaryVnic, err := cp.client.Compute().GetSecondaryVNICForInstance(ctx, compartmentID, instanceID) + OpenShiftTagNamesapce := cp.getOpenShiftTagNamespaceByInstance(ctx, instanceID) + + if OpenShiftTagNamesapce != "" { + secondaryVnics, err := cp.client.Compute().GetSecondaryVNICsForInstance(ctx, compartmentID, instanceID) if err != nil { - return nil, errors.Wrap(err, "GetSecondaryVNICForInstance") + return nil, err } - if secondaryVnic == nil { + if secondaryVnics == nil || len(secondaryVnics) == 0 { return addresses, nil } + for _, secondaryVnic := range secondaryVnics { + if cp.checkOpenShiftISCSIBootVolumeTagByVnic(ctx, secondaryVnic, OpenShiftTagNamesapce) { + if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PrivateIp != nil && *secondaryVnic.PrivateIp != "" { + ip := net.ParseIP(*secondaryVnic.PrivateIp) + if ip == nil { + return nil, fmt.Errorf("instance has invalid private address: %q", *secondaryVnic.PrivateIp) + } + addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: ip.String()}) + } - if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PrivateIp != nil && *secondaryVnic.PrivateIp != "" { - ip := net.ParseIP(*secondaryVnic.PrivateIp) - if ip == nil { - return nil, fmt.Errorf("instance has invalid private address: %q", *secondaryVnic.PrivateIp) - } - addresses = append(addresses, api.NodeAddress{Type: api.NodeInternalIP, Address: ip.String()}) - } - - if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PublicIp != nil && *secondaryVnic.PublicIp != "" { - ip := net.ParseIP(*secondaryVnic.PublicIp) - if ip == nil { - return nil, errors.Errorf("instance has invalid public address: %q", *secondaryVnic.PublicIp) + if (secondaryVnic.IsPrimary == nil || !*secondaryVnic.IsPrimary) && secondaryVnic.PublicIp != nil && *secondaryVnic.PublicIp != "" { + ip := net.ParseIP(*secondaryVnic.PublicIp) + if ip == nil { + return nil, errors.Errorf("instance has invalid public address: %q", *secondaryVnic.PublicIp) + } + addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) + } } - addresses = append(addresses, api.NodeAddress{Type: api.NodeExternalIP, Address: ip.String()}) } } + // Changing this can have wide reaching impact. // // if vnic.HostnameLabel != nil && *vnic.HostnameLabel != "" { @@ -340,32 +352,32 @@ func (cp *CloudProvider) getCompartmentIDByNodeName(nodeName string) (string, er return "", errors.New("compartmentID annotation missing in the node. Would retry") } -func (cp *CloudProvider) checkOpenShiftNodesSecondaryVnicByInstance(instanceID string) (bool, error) { - var SecondaryVnicUsageInstances = []string{"BM.Standard3.64"} - nodeList, err := cp.NodeLister.List(labels.Everything()) +func (cp *CloudProvider) getOpenShiftTagNamespaceByInstance(ctx context.Context, instanceID string) string { + instance, err := cp.client.Compute().GetInstance(ctx, instanceID) if err != nil { - return false, errors.Wrap(err, "error listing all the nodes using node informer") + return "" } - for _, node := range nodeList { - providerID, err := MapProviderIDToInstanceID(node.Spec.ProviderID) - if err != nil { - return false, errors.New("Failed to map providerID to instanceID.") - } - if providerID == instanceID { - if _, ok := node.Labels[OpenShiftNodeIdentifierLabel]; ok { - if instanceType, ok := node.Labels[api.LabelInstanceTypeStable]; ok && contains(SecondaryVnicUsageInstances, instanceType) { - return true, nil - } - } + + if instance.DefinedTags == nil { + return "" + } + + for namespace := range instance.DefinedTags { + if strings.HasPrefix(namespace, OpenShiftTagNamesapcePrefix) { + return namespace } } - return false, errors.New("Failed to check OpenShift node using node lables. Returning false") + return "" } -// contains is a utility method to check if a string is part of a slice -func contains(s []string, e string) bool { - for _, a := range s { - if a == e { +func (cp *CloudProvider) checkOpenShiftISCSIBootVolumeTagByVnic(ctx context.Context, vnic *core.Vnic, namespace string) bool { + if vnic.DefinedTags == nil { + return false + } + + if tags, namespaceExists := vnic.DefinedTags[namespace]; namespaceExists { + // Check if the boot volume type key exists and its value is ISCSI + if bootVolume, keyExists := tags[OpenShiftBootVolumeType]; keyExists && bootVolume == OpenShiftBootVolumeISCSI { return true } } diff --git a/pkg/cloudprovider/providers/oci/instances_test.go b/pkg/cloudprovider/providers/oci/instances_test.go index 0317b6a889..5bb7e73569 100644 --- a/pkg/cloudprovider/providers/oci/instances_test.go +++ b/pkg/cloudprovider/providers/oci/instances_test.go @@ -344,8 +344,8 @@ func (MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compartm return instanceVnics[instanceID], nil } -func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { - return instanceVnics[instanceID], nil +func (c *MockComputeClient) GetSecondaryVNICsForInstance(ctx context.Context, compartmentID, instanceID string) ([]*core.Vnic, error) { + return []*core.Vnic{instanceVnics[instanceID]}, nil } func (MockComputeClient) FindVolumeAttachment(ctx context.Context, compartmentID, volumeID string) (core.VolumeAttachment, error) { diff --git a/pkg/cloudprovider/providers/oci/node_info_controller.go b/pkg/cloudprovider/providers/oci/node_info_controller.go index 5505569c23..69c9b00f14 100644 --- a/pkg/cloudprovider/providers/oci/node_info_controller.go +++ b/pkg/cloudprovider/providers/oci/node_info_controller.go @@ -41,10 +41,9 @@ import ( // metadata labeling for placement info const ( - FaultDomainLabel = "oci.oraclecloud.com/fault-domain" - CompartmentIDAnnotation = "oci.oraclecloud.com/compartment-id" - OpenShiftNodeIdentifierLabel = "node.openshift.io/os_id" - timeout = 10 * time.Second + FaultDomainLabel = "oci.oraclecloud.com/fault-domain" + CompartmentIDAnnotation = "oci.oraclecloud.com/compartment-id" + timeout = 10 * time.Second ) // NodeInfoController helps compute workers in the cluster diff --git a/pkg/csi/driver/bv_controller_test.go b/pkg/csi/driver/bv_controller_test.go index cd106f5e67..4ade3b9e0e 100644 --- a/pkg/csi/driver/bv_controller_test.go +++ b/pkg/csi/driver/bv_controller_test.go @@ -568,7 +568,7 @@ func (c *MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compa return nil, nil } -func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { +func (c *MockComputeClient) GetSecondaryVNICsForInstance(ctx context.Context, compartmentID, instanceID string) ([]*core.Vnic, error) { return nil, nil } diff --git a/pkg/oci/client/compute.go b/pkg/oci/client/compute.go index 380bdc33ef..49bc7afc70 100644 --- a/pkg/oci/client/compute.go +++ b/pkg/oci/client/compute.go @@ -35,7 +35,7 @@ type ComputeInterface interface { GetPrimaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) - GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) + GetSecondaryVNICsForInstance(ctx context.Context, compartmentID, instanceID string) ([]*core.Vnic, error) VolumeAttachmentInterface } @@ -185,9 +185,9 @@ func (c *client) GetPrimaryVNICForInstance(ctx context.Context, compartmentID, i return nil, errors.WithStack(errNotFound) } -func (c *client) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { +func (c *client) GetSecondaryVNICsForInstance(ctx context.Context, compartmentID, instanceID string) ([]*core.Vnic, error) { logger := c.logger.With("instanceID", instanceID, "compartmentID", compartmentID) - + secondaryVnics := []*core.Vnic{} var page *string for { resp, err := c.listVNICAttachments(ctx, core.ListVnicAttachmentsRequest{ @@ -222,7 +222,7 @@ func (c *client) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, } if !*vnic.IsPrimary { - return vnic, nil + secondaryVnics = append(secondaryVnics, vnic) } } @@ -231,7 +231,7 @@ func (c *client) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, } } - return nil, errors.WithStack(errNotFound) + return secondaryVnics, nil } func (c *client) GetInstanceByNodeName(ctx context.Context, compartmentID, vcnID, nodeName string) (*core.Instance, error) { diff --git a/pkg/volume/provisioner/block/block_test.go b/pkg/volume/provisioner/block/block_test.go index f488611f89..54901cc8ba 100644 --- a/pkg/volume/provisioner/block/block_test.go +++ b/pkg/volume/provisioner/block/block_test.go @@ -246,7 +246,7 @@ func (c *MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compa return nil, nil } -func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { +func (c *MockComputeClient) GetSecondaryVNICsForInstance(ctx context.Context, compartmentID, instanceID string) ([]*core.Vnic, error) { return nil, nil } diff --git a/pkg/volume/provisioner/fss/fss_test.go b/pkg/volume/provisioner/fss/fss_test.go index c076ba9ec4..eacb08b718 100644 --- a/pkg/volume/provisioner/fss/fss_test.go +++ b/pkg/volume/provisioner/fss/fss_test.go @@ -244,7 +244,7 @@ func (c *MockComputeClient) GetPrimaryVNICForInstance(ctx context.Context, compa return nil, nil } -func (c *MockComputeClient) GetSecondaryVNICForInstance(ctx context.Context, compartmentID, instanceID string) (*core.Vnic, error) { +func (c *MockComputeClient) GetSecondaryVNICsForInstance(ctx context.Context, compartmentID, instanceID string) ([]*core.Vnic, error) { return nil, nil }