Skip to content

Commit d84f36d

Browse files
authored
Merge pull request #448 from shapeblue/multinic-support
Add multiple nics support to nodes
2 parents 312a3c9 + 9d77b1c commit d84f36d

8 files changed

+179
-15
lines changed

api/v1beta1/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta2/cloudstackmachine_conversion.go

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,45 @@ limitations under the License.
1717
package v1beta2
1818

1919
import (
20+
machineryconversion "k8s.io/apimachinery/pkg/conversion"
2021
"sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3"
22+
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
2123
"sigs.k8s.io/controller-runtime/pkg/conversion"
2224
)
2325

2426
func (src *CloudStackMachine) ConvertTo(dstRaw conversion.Hub) error { // nolint
2527
dst := dstRaw.(*v1beta3.CloudStackMachine)
26-
return Convert_v1beta2_CloudStackMachine_To_v1beta3_CloudStackMachine(src, dst, nil)
28+
if err := Convert_v1beta2_CloudStackMachine_To_v1beta3_CloudStackMachine(src, dst, nil); err != nil {
29+
return err
30+
}
31+
32+
// Manually restore data
33+
restored := &v1beta3.CloudStackMachine{}
34+
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
35+
return err
36+
}
37+
38+
if len(restored.Spec.Networks) > 0 {
39+
dst.Spec.Networks = restored.Spec.Networks
40+
}
41+
42+
return nil
2743
}
2844

2945
func (dst *CloudStackMachine) ConvertFrom(srcRaw conversion.Hub) error { // nolint
3046
src := srcRaw.(*v1beta3.CloudStackMachine)
31-
return Convert_v1beta3_CloudStackMachine_To_v1beta2_CloudStackMachine(src, dst, nil)
47+
if err := Convert_v1beta3_CloudStackMachine_To_v1beta2_CloudStackMachine(src, dst, nil); err != nil {
48+
return err
49+
}
50+
51+
// Preserve Hub data on down-conversion, including Networks field
52+
err := utilconversion.MarshalData(src, dst)
53+
return err
54+
}
55+
56+
// Convert_v1beta3_CloudStackMachineSpec_To_v1beta2_CloudStackMachineSpec handles the conversion from v1beta3 to v1beta2,
57+
// ignoring the Networks field that doesn't exist in v1beta2
58+
func Convert_v1beta3_CloudStackMachineSpec_To_v1beta2_CloudStackMachineSpec(in *v1beta3.CloudStackMachineSpec, out *CloudStackMachineSpec, s machineryconversion.Scope) error { // nolint
59+
// Use the auto-generated conversion function, which will handle all fields except Networks
60+
return autoConvert_v1beta3_CloudStackMachineSpec_To_v1beta2_CloudStackMachineSpec(in, out, s)
3261
}

api/v1beta2/zz_generated.conversion.go

Lines changed: 28 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta3/cloudstackmachine_types.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ const (
3232
NoAffinity = "no"
3333
)
3434

35+
type NetworkSpec struct {
36+
// CloudStack Network Name (required to resolve ID)
37+
Name string `json:"name"`
38+
39+
// Optional IP in the network
40+
IP string `json:"ip,omitempty"`
41+
42+
// Optional Network ID (overrides Name if set)
43+
ID string `json:"id,omitempty"`
44+
}
45+
3546
// CloudStackMachineSpec defines the desired state of CloudStackMachine
3647
type CloudStackMachineSpec struct {
3748
// Name.
@@ -55,6 +66,11 @@ type CloudStackMachineSpec struct {
5566
// +optional
5667
DiskOffering CloudStackResourceDiskOffering `json:"diskOffering,omitempty"`
5768

69+
// The list of networks (overrides zone.network)
70+
// +optional
71+
// In CloudStackMachineSpec
72+
Networks []NetworkSpec `json:"networks,omitempty"`
73+
5874
// CloudStack ssh key to use.
5975
// +optional
6076
SSHKey string `json:"sshKey"`

api/v1beta3/zz_generated.deepcopy.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachines.yaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,25 @@ spec:
659659
name:
660660
description: Name.
661661
type: string
662+
networks:
663+
description: |-
664+
The list of networks (overrides zone.network)
665+
In CloudStackMachineSpec
666+
items:
667+
properties:
668+
id:
669+
description: Optional Network ID (overrides Name if set)
670+
type: string
671+
ip:
672+
description: Optional IP in the network
673+
type: string
674+
name:
675+
description: CloudStack Network Name (required to resolve ID)
676+
type: string
677+
required:
678+
- name
679+
type: object
680+
type: array
662681
offering:
663682
description: CloudStack compute offering.
664683
properties:

config/crd/bases/infrastructure.cluster.x-k8s.io_cloudstackmachinetemplates.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,27 @@ spec:
594594
name:
595595
description: Name.
596596
type: string
597+
networks:
598+
description: |-
599+
The list of networks (overrides zone.network)
600+
In CloudStackMachineSpec
601+
items:
602+
properties:
603+
id:
604+
description: Optional Network ID (overrides Name if
605+
set)
606+
type: string
607+
ip:
608+
description: Optional IP in the network
609+
type: string
610+
name:
611+
description: CloudStack Network Name (required to resolve
612+
ID)
613+
type: string
614+
required:
615+
- name
616+
type: object
617+
type: array
597618
offering:
598619
description: CloudStack compute offering.
599620
properties:

pkg/cloud/instance.go

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,38 @@ func (c *client) CheckLimits(
302302
return nil
303303
}
304304

305+
func (c *client) resolveNetworkIDByName(name string) (string, error) {
306+
net, count, err := c.cs.Network.GetNetworkByName(name, cloudstack.WithProject(c.user.Project.ID))
307+
if err != nil {
308+
return "", errors.Wrapf(err, "failed to look up network %q", name)
309+
}
310+
if count != 1 {
311+
return "", errors.Errorf("expected 1 network named %q, but got %d", name, count)
312+
}
313+
return net.Id, nil
314+
}
315+
316+
func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]map[string]string, error) {
317+
ipToNetworkList := []map[string]string{}
318+
319+
for _, net := range csMachine.Spec.Networks {
320+
networkID := net.ID
321+
if networkID == "" {
322+
var err error
323+
networkID, err = c.resolveNetworkIDByName(net.Name)
324+
if err != nil {
325+
return nil, err
326+
}
327+
}
328+
entry := map[string]string{"networkid": networkID}
329+
if net.IP != "" {
330+
entry["ip"] = net.IP
331+
}
332+
ipToNetworkList = append(ipToNetworkList, entry)
333+
}
334+
return ipToNetworkList, nil
335+
}
336+
305337
// DeployVM will create a VM instance,
306338
// and sets the infrastructure machine spec and status accordingly.
307339
func (c *client) DeployVM(
@@ -322,7 +354,17 @@ func (c *client) DeployVM(
322354
}
323355

324356
p := c.cs.VirtualMachine.NewDeployVirtualMachineParams(offering.Id, templateID, fd.Spec.Zone.ID)
325-
p.SetNetworkids([]string{fd.Spec.Zone.Network.ID})
357+
358+
if len(csMachine.Spec.Networks) == 0 && fd.Spec.Zone.Network.ID != "" {
359+
p.SetNetworkids([]string{fd.Spec.Zone.Network.ID})
360+
} else {
361+
ipToNetworkList, err := c.buildIPToNetworkList(csMachine)
362+
if err != nil {
363+
return err
364+
}
365+
p.SetIptonetworklist(ipToNetworkList)
366+
}
367+
326368
setIfNotEmpty(csMachine.Name, p.SetName)
327369
setIfNotEmpty(capiMachine.Name, p.SetDisplayname)
328370
setIfNotEmpty(diskOfferingID, p.SetDiskofferingid)

0 commit comments

Comments
 (0)