Skip to content

Commit 9b48982

Browse files
authored
[CCM] Replace stackit:///<server-id in favor of stackit://<server-id> (#132)
* Strictly follow providerID spec Signed-off-by: Niclas Schad <[email protected]> * clean up some todos Signed-off-by: Niclas Schad <[email protected]> --------- Signed-off-by: Niclas Schad <[email protected]>
1 parent 38fd801 commit 9b48982

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

pkg/ccm/instances.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ const (
3838
instanceStopping = "STOPPING"
3939
)
4040

41-
// If Instances.InstanceID or cloudprovider.GetInstanceProviderID is changed, the regexp should be changed too.
42-
var providerIDRegexp = regexp.MustCompile(`^` + ProviderName + `://([^/]*)/([^/]+)$`)
41+
// If makeInstanceID is changed, the regexp should be changed too.
42+
var providerIDRegexp = regexp.MustCompile(`^` + ProviderName + `://([^/]+)$`)
4343

44-
// TODO: remove old provider after migration
44+
// TODO(migration): remove old provider support after migration
4545
var oldProviderIDRegexp = regexp.MustCompile(`^` + oldProviderName + `://([^/]*)/([^/]+)$`)
4646

4747
// Instances encapsulates an implementation of Instances for OpenStack.
@@ -114,7 +114,6 @@ func (i *Instances) InstanceMetadata(ctx context.Context, node *corev1.Node) (*c
114114
})
115115
}
116116

117-
// TODO: where to find IPv6SupportDisabled
118117
if ipv6, ok := nic.GetIpv6Ok(); ok {
119118
addToNodeAddresses(&addresses,
120119
corev1.NodeAddress{
@@ -150,7 +149,7 @@ func (i *Instances) InstanceMetadata(ctx context.Context, node *corev1.Node) (*c
150149
}
151150

152151
func (i *Instances) makeInstanceID(server *iaas.Server) string {
153-
return fmt.Sprintf("%s:///%s", ProviderName, server.GetId())
152+
return fmt.Sprintf("%s://%s", ProviderName, server.GetId())
154153
}
155154

156155
// addToNodeAddresses appends the NodeAddresses to the passed-by-pointer slice,
@@ -174,20 +173,31 @@ func addToNodeAddresses(addresses *[]corev1.NodeAddress, addAddresses ...corev1.
174173
// A providerID is build out of '${ProviderName}:///${instance-id}' which contains ':///'.
175174
// or '${ProviderName}://${region}/${instance-id}' which contains '://'.
176175
// See cloudprovider.GetInstanceProviderID and Instances.InstanceID.
176+
// TODO(migration): rework function once openstack:/// is no longer used
177177
func instanceIDFromProviderID(providerID string) (instanceID, region string, err error) {
178178
// https://github.com/kubernetes/kubernetes/issues/85731
179179
if providerID != "" && !strings.Contains(providerID, "://") {
180180
providerID = ProviderName + "://" + providerID
181181
}
182182

183-
matches := providerIDRegexp.FindStringSubmatch(providerID)
184-
if len(matches) != 3 {
185-
matches = oldProviderIDRegexp.FindStringSubmatch(providerID)
183+
switch {
184+
// TODO(migration): remove old provider support after migration
185+
case strings.HasPrefix(providerID, "openstack://"):
186+
matches := oldProviderIDRegexp.FindStringSubmatch(providerID)
186187
if len(matches) != 3 {
187-
return "", "", fmt.Errorf("ProviderID \"%s\" didn't match expected format \"%s://region/InstanceID\"", ProviderName, providerID)
188+
return "", "", fmt.Errorf("ProviderID \"%s\" didn't match expected format \"%s://region/InstanceID\"", oldProviderName, providerID)
188189
}
190+
return matches[2], matches[1], nil
191+
case strings.HasPrefix(providerID, "stackit://"):
192+
matches := providerIDRegexp.FindStringSubmatch(providerID)
193+
if len(matches) != 2 {
194+
return "", "", fmt.Errorf("ProviderID \"%s\" didn't match expected format \"%s://InstanceID\"", ProviderName, providerID)
195+
}
196+
// The new stackit:// doesn't use the old regional providerID anymore and strictly follows the spec
197+
return matches[1], "", nil
198+
default:
199+
return "", "", fmt.Errorf("unknown ProviderName")
189200
}
190-
return matches[2], matches[1], nil
191201
}
192202

193203
func getServerByName(ctx context.Context, client stackit.NodeClient, name, projectID, region string) (*iaas.Server, error) {

pkg/ccm/instances_test.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,41 @@ var _ = Describe("Node Controller", func() {
9292
node := &corev1.Node{
9393
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
9494
Spec: corev1.NodeSpec{
95-
ProviderID: fmt.Sprintf("stackit:///%s", serverID),
95+
ProviderID: fmt.Sprintf("stackit://%s", serverID),
96+
},
97+
}
98+
99+
exist, err := instance.InstanceExists(context.Background(), node)
100+
Expect(err).NotTo(HaveOccurred())
101+
Expect(exist).To(BeTrue())
102+
})
103+
104+
It("successfully get the instance when old provider ID is there", func() {
105+
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(&iaas.Server{
106+
Name: ptr.To("foo"),
107+
}, nil)
108+
109+
node := &corev1.Node{
110+
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
111+
Spec: corev1.NodeSpec{
112+
ProviderID: fmt.Sprintf("openstack:///%s", serverID),
113+
},
114+
}
115+
116+
exist, err := instance.InstanceExists(context.Background(), node)
117+
Expect(err).NotTo(HaveOccurred())
118+
Expect(exist).To(BeTrue())
119+
})
120+
121+
It("successfully get the instance when old regional provider ID is there", func() {
122+
nodeMockClient.EXPECT().GetServer(gomock.Any(), projectID, region, serverID).Return(&iaas.Server{
123+
Name: ptr.To("foo"),
124+
}, nil)
125+
126+
node := &corev1.Node{
127+
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
128+
Spec: corev1.NodeSpec{
129+
ProviderID: fmt.Sprintf("openstack://%s/%s", region, serverID),
96130
},
97131
}
98132

@@ -118,7 +152,7 @@ var _ = Describe("Node Controller", func() {
118152
node := &corev1.Node{
119153
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
120154
Spec: corev1.NodeSpec{
121-
ProviderID: fmt.Sprintf("stackit:///%s", serverID),
155+
ProviderID: fmt.Sprintf("stackit://%s", serverID),
122156
},
123157
}
124158

@@ -155,7 +189,7 @@ var _ = Describe("Node Controller", func() {
155189
node := &corev1.Node{
156190
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
157191
Spec: corev1.NodeSpec{
158-
ProviderID: fmt.Sprintf("stackit:///%s", serverID),
192+
ProviderID: fmt.Sprintf("stackit://%s", serverID),
159193
},
160194
}
161195

@@ -210,7 +244,7 @@ var _ = Describe("Node Controller", func() {
210244

211245
metadata, err := instance.InstanceMetadata(context.Background(), node)
212246
Expect(err).NotTo(HaveOccurred())
213-
Expect(metadata.ProviderID).To(Equal(fmt.Sprintf("stackit:///%s", serverID)))
247+
Expect(metadata.ProviderID).To(Equal(fmt.Sprintf("stackit://%s", serverID)))
214248
Expect(metadata.InstanceType).To(Equal("flatcar"))
215249
Expect(metadata.NodeAddresses).To(Equal([]corev1.NodeAddress{
216250
{

0 commit comments

Comments
 (0)