Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🌱 use providerID string as-is #8577

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions api/v1beta1/index/machine.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
"sigs.k8s.io/cluster-api/controllers/noderefutil"
)

const (
Expand Down Expand Up @@ -82,14 +81,11 @@ func machineByProviderID(o client.Object) []string {
panic(fmt.Sprintf("Expected a Machine but got a %T", o))
}

if pointer.StringDeref(machine.Spec.ProviderID, "") == "" {
return nil
}
providerID := pointer.StringDeref(machine.Spec.ProviderID, "")

providerID, err := noderefutil.NewProviderID(*machine.Spec.ProviderID)
if err != nil {
// Failed to create providerID, skipping.
if providerID == "" {
return nil
}
return []string{providerID.IndexKey()}

return []string{providerID}
}
11 changes: 4 additions & 7 deletions api/v1beta1/index/machine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
"sigs.k8s.io/cluster-api/controllers/noderefutil"
)

func TestIndexMachineByNodeName(t *testing.T) {
Expand Down Expand Up @@ -62,9 +61,7 @@ func TestIndexMachineByNodeName(t *testing.T) {
}

func TestIndexMachineByProviderID(t *testing.T) {
validProviderID, err := noderefutil.NewProviderID("aws://region/zone/id")
g := NewWithT(t)
g.Expect(err).ToNot(HaveOccurred())
validProviderID := "aws://region/zone/id"

testCases := []struct {
name string
Expand All @@ -80,7 +77,7 @@ func TestIndexMachineByProviderID(t *testing.T) {
name: "Machine has invalid providerID",
object: &clusterv1.Machine{
Spec: clusterv1.MachineSpec{
ProviderID: pointer.String("invalid"),
ProviderID: pointer.String(""),
},
},
expected: nil,
Expand All @@ -89,10 +86,10 @@ func TestIndexMachineByProviderID(t *testing.T) {
name: "Machine has valid providerID",
object: &clusterv1.Machine{
Spec: clusterv1.MachineSpec{
ProviderID: pointer.String(validProviderID.String()),
ProviderID: pointer.String(validProviderID),
},
},
expected: []string{validProviderID.IndexKey()},
expected: []string{validProviderID},
},
}

Expand Down
8 changes: 3 additions & 5 deletions api/v1beta1/index/machinepool.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"

"sigs.k8s.io/cluster-api/controllers/noderefutil"
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
)

Expand Down Expand Up @@ -93,12 +92,11 @@ func machinePoolByProviderID(o client.Object) []string {

providerIDs := make([]string, 0, len(machinepool.Spec.ProviderIDList))
for _, id := range machinepool.Spec.ProviderIDList {
providerID, err := noderefutil.NewProviderID(id)
if err != nil {
// Failed to create providerID, skipping.
if id == "" {
// Valid providerID not found, skipping.
continue
}
providerIDs = append(providerIDs, providerID.IndexKey())
providerIDs = append(providerIDs, id)
}

return providerIDs
Expand Down
14 changes: 5 additions & 9 deletions api/v1beta1/index/machinepool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import (
corev1 "k8s.io/api/core/v1"
"sigs.k8s.io/controller-runtime/pkg/client"

"sigs.k8s.io/cluster-api/controllers/noderefutil"
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
)

Expand Down Expand Up @@ -66,11 +65,8 @@ func TestIndexMachinePoolByNodeName(t *testing.T) {
}

func TestIndexMachinePoolByProviderID(t *testing.T) {
g := NewWithT(t)
validProviderID, err := noderefutil.NewProviderID("aws://region/zone/1")
g.Expect(err).ToNot(HaveOccurred())
otherValidProviderID, err := noderefutil.NewProviderID("aws://region/zone/2")
g.Expect(err).ToNot(HaveOccurred())
validProviderID := "aws://region/zone/1"
otherValidProviderID := "aws://region/zone/2"

testCases := []struct {
name string
Expand All @@ -86,7 +82,7 @@ func TestIndexMachinePoolByProviderID(t *testing.T) {
name: "MachinePool has invalid providerID",
object: &expv1.MachinePool{
Spec: expv1.MachinePoolSpec{
ProviderIDList: []string{"invalid"},
ProviderIDList: []string{""},
},
},
expected: []string{},
Expand All @@ -95,10 +91,10 @@ func TestIndexMachinePoolByProviderID(t *testing.T) {
name: "MachinePool has valid providerIDs",
object: &expv1.MachinePool{
Spec: expv1.MachinePoolSpec{
ProviderIDList: []string{validProviderID.String(), otherValidProviderID.String()},
ProviderIDList: []string{validProviderID, otherValidProviderID},
},
},
expected: []string{validProviderID.IndexKey(), otherValidProviderID.IndexKey()},
expected: []string{validProviderID, otherValidProviderID},
},
}

Expand Down
9 changes: 1 addition & 8 deletions api/v1beta1/index/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ import (

corev1 "k8s.io/api/core/v1"
"sigs.k8s.io/controller-runtime/pkg/client"

"sigs.k8s.io/cluster-api/controllers/noderefutil"
)

const (
Expand All @@ -42,10 +40,5 @@ func NodeByProviderID(o client.Object) []string {
return nil
}

providerID, err := noderefutil.NewProviderID(node.Spec.ProviderID)
if err != nil {
// Failed to create providerID, skipping.
return nil
}
return []string{providerID.IndexKey()}
return []string{node.Spec.ProviderID}
}
12 changes: 4 additions & 8 deletions api/v1beta1/index/node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,10 @@ import (
. "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
"sigs.k8s.io/controller-runtime/pkg/client"

"sigs.k8s.io/cluster-api/controllers/noderefutil"
)

func TestIndexNodeByProviderID(t *testing.T) {
validProviderID, err := noderefutil.NewProviderID("aws://region/zone/id")
g := NewWithT(t)
g.Expect(err).ToNot(HaveOccurred())
validProviderID := "aws://region/zone/id"

testCases := []struct {
name string
Expand All @@ -45,7 +41,7 @@ func TestIndexNodeByProviderID(t *testing.T) {
name: "Node has invalid providerID",
object: &corev1.Node{
Spec: corev1.NodeSpec{
ProviderID: "invalid",
ProviderID: "",
},
},
expected: nil,
Expand All @@ -54,10 +50,10 @@ func TestIndexNodeByProviderID(t *testing.T) {
name: "Node has valid providerID",
object: &corev1.Node{
Spec: corev1.NodeSpec{
ProviderID: validProviderID.String(),
ProviderID: validProviderID,
},
},
expected: []string{validProviderID.IndexKey()},
expected: []string{validProviderID},
},
}

Expand Down
22 changes: 22 additions & 0 deletions controllers/noderefutil/providerid.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ limitations under the License.
*/

// Package noderefutil implements NodeRef utils.
// The ProviderID type is deprecated and unused by Cluster API internally.
// It will be removed entirely in a future release.
package noderefutil
jackfrancis marked this conversation as resolved.
Show resolved Hide resolved

import (
Expand All @@ -25,14 +27,20 @@ import (

var (
// ErrEmptyProviderID means that the provider id is empty.
//
// Deprecated: This var is going to be removed in a future release.
ErrEmptyProviderID = errors.New("providerID is empty")

// ErrInvalidProviderID means that the provider id has an invalid form.
//
// Deprecated: This var is going to be removed in a future release.
ErrInvalidProviderID = errors.New("providerID must be of the form <cloudProvider>://<optional>/<segments>/<provider id>")
)

// ProviderID is a struct representation of a Kubernetes ProviderID.
// Format: cloudProvider://optional/segments/etc/id
//
// Deprecated: This struct is going to be removed in a future release.
type ProviderID struct {
original string
cloudProvider string
Expand All @@ -48,6 +56,8 @@ type ProviderID struct {
var providerIDRegex = regexp.MustCompile("^[^:]+://.*[^/]$")

// NewProviderID parses the input string and returns a new ProviderID.
//
// Deprecated: This constructor is going to be removed in a future release.
func NewProviderID(id string) (*ProviderID, error) {
if id == "" {
return nil, ErrEmptyProviderID
Expand Down Expand Up @@ -77,32 +87,44 @@ func NewProviderID(id string) (*ProviderID, error) {
}

// CloudProvider returns the cloud provider portion of the ProviderID.
//
// Deprecated: This method is going to be removed in a future release.
func (p *ProviderID) CloudProvider() string {
return p.cloudProvider
}

// ID returns the identifier portion of the ProviderID.
//
// Deprecated: This method is going to be removed in a future release.
func (p *ProviderID) ID() string {
return p.id
}

// Equals returns true if this ProviderID string matches another ProviderID string.
//
// Deprecated: This method is going to be removed in a future release.
func (p *ProviderID) Equals(o *ProviderID) bool {
return p.String() == o.String()
}

// String returns the string representation of this object.
//
// Deprecated: This method is going to be removed in a future release.
func (p ProviderID) String() string {
return p.original
}

// Validate returns true if the provider id is valid.
//
// Deprecated: This method is going to be removed in a future release.
func (p *ProviderID) Validate() bool {
return p.CloudProvider() != "" && p.ID() != ""
}

// IndexKey returns the required level of uniqueness
// to represent and index machines uniquely from their node providerID.
//
// Deprecated: This method is going to be removed in a future release.
func (p *ProviderID) IndexKey() string {
return p.String()
}
2 changes: 2 additions & 0 deletions controllers/noderefutil/providerid_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

// The ProviderID type is deprecated and unused by Cluster API internally.
// It will be removed entirely in a future release.
package noderefutil

import (
Expand Down
6 changes: 2 additions & 4 deletions exp/internal/controllers/machinepool_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import (
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
"sigs.k8s.io/cluster-api/api/v1beta1/index"
"sigs.k8s.io/cluster-api/controllers/external"
"sigs.k8s.io/cluster-api/controllers/noderefutil"
"sigs.k8s.io/cluster-api/controllers/remote"
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
"sigs.k8s.io/cluster-api/util"
Expand Down Expand Up @@ -352,15 +351,14 @@ func (r *MachinePoolReconciler) nodeToMachinePool(o client.Object) []reconcile.R

// Otherwise let's match by providerID. This is useful when e.g the NodeRef has not been set yet.
// Match by providerID
nodeProviderID, err := noderefutil.NewProviderID(node.Spec.ProviderID)
if err != nil {
if node.Spec.ProviderID == "" {
return nil
}
machinePoolList = &expv1.MachinePoolList{}
if err := r.Client.List(
context.TODO(),
machinePoolList,
append(filters, client.MatchingFields{index.MachinePoolProviderIDField: nodeProviderID.IndexKey()})...); err != nil {
append(filters, client.MatchingFields{index.MachinePoolProviderIDField: node.Spec.ProviderID})...); err != nil {
return nil
}

Expand Down
29 changes: 12 additions & 17 deletions exp/internal/controllers/machinepool_controller_noderef.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
"sigs.k8s.io/cluster-api/controllers/noderefutil"
"sigs.k8s.io/cluster-api/controllers/remote"
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
"sigs.k8s.io/cluster-api/internal/util/taints"
Expand Down Expand Up @@ -132,21 +131,19 @@ func (r *MachinePoolReconciler) deleteRetiredNodes(ctx context.Context, c client
continue
}

nodeProviderID, err := noderefutil.NewProviderID(node.Spec.ProviderID)
if err != nil {
log.V(2).Info("Failed to parse ProviderID, skipping", "err", err, "providerID", node.Spec.ProviderID)
if node.Spec.ProviderID == "" {
log.V(2).Info("No ProviderID detected, skipping", "providerID", node.Spec.ProviderID)
continue
}

nodeRefsMap[nodeProviderID.String()] = node
nodeRefsMap[node.Spec.ProviderID] = node
}
for _, providerID := range providerIDList {
pid, err := noderefutil.NewProviderID(providerID)
if err != nil {
log.V(2).Info("Failed to parse ProviderID, skipping", "err", err, "providerID", providerID)
if providerID == "" {
log.V(2).Info("No ProviderID detected, skipping", "providerID", providerID)
continue
}
delete(nodeRefsMap, pid.String())
delete(nodeRefsMap, providerID)
}
for _, node := range nodeRefsMap {
if err := c.Delete(ctx, node); err != nil {
Expand All @@ -168,13 +165,12 @@ func (r *MachinePoolReconciler) getNodeReferences(ctx context.Context, c client.
}

for _, node := range nodeList.Items {
nodeProviderID, err := noderefutil.NewProviderID(node.Spec.ProviderID)
if err != nil {
log.V(2).Info("Failed to parse ProviderID, skipping", "err", err, "providerID", node.Spec.ProviderID)
if node.Spec.ProviderID == "" {
log.V(2).Info("No ProviderID detected, skipping", "providerID", node.Spec.ProviderID)
continue
}

nodeRefsMap[nodeProviderID.String()] = node
nodeRefsMap[node.Spec.ProviderID] = node
}

if nodeList.Continue == "" {
Expand All @@ -184,12 +180,11 @@ func (r *MachinePoolReconciler) getNodeReferences(ctx context.Context, c client.

var nodeRefs []corev1.ObjectReference
for _, providerID := range providerIDList {
pid, err := noderefutil.NewProviderID(providerID)
if err != nil {
log.V(2).Info("Failed to parse ProviderID, skipping", "err", err, "providerID", providerID)
if providerID == "" {
log.V(2).Info("No ProviderID detected, skipping", "providerID", providerID)
continue
}
if node, ok := nodeRefsMap[pid.String()]; ok {
if node, ok := nodeRefsMap[providerID]; ok {
available++
if nodeIsReady(&node) {
ready++
Expand Down
Loading