Skip to content
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
10 changes: 5 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ require (
k8s.io/client-go v0.23.0
k8s.io/cluster-bootstrap v0.23.1
k8s.io/klog/v2 v2.30.0
sigs.k8s.io/cluster-api v1.0.2
sigs.k8s.io/cluster-api-provider-openstack v0.5.1-0.20220113110629-19889578bf84
sigs.k8s.io/cluster-api v1.1.0
sigs.k8s.io/cluster-api-provider-openstack v0.5.1-0.20220401180447-6ba04de45920
sigs.k8s.io/controller-runtime v0.11.0
sigs.k8s.io/yaml v1.3.0
)
Expand Down Expand Up @@ -46,7 +46,7 @@ require (
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.5 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/gobuffalo/flect v0.2.3 // indirect
github.com/gobuffalo/flect v0.2.4 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/mock v1.6.0 // indirect
Expand Down Expand Up @@ -90,7 +90,7 @@ require (
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
go4.org v0.0.0-20191010144846-132d2879e1e9 // indirect
golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
golang.org/x/text v0.3.7 // indirect
Expand All @@ -116,5 +116,5 @@ require (

replace (
sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.0.2
sigs.k8s.io/cluster-api-provider-openstack => github.com/openshift/cluster-api-provider-openstack v0.5.1-0.20220113110629-19889578bf84
sigs.k8s.io/cluster-api-provider-openstack => github.com/openshift/cluster-api-provider-openstack v0.5.1-0.20220401180447-6ba04de45920
)
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78
github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY=
github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
github.com/gobuffalo/flect v0.2.4 h1:BSYA8+T60cdyq+vynaSUjqSVI9mDEg9ZfQUXKmfjo4I=
github.com/gobuffalo/flect v0.2.4/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8=
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
Expand Down Expand Up @@ -829,6 +831,8 @@ github.com/openshift/client-go v0.0.0-20211209144617-7385dd6338e3 h1:SG1aqwleU6b
github.com/openshift/client-go v0.0.0-20211209144617-7385dd6338e3/go.mod h1:cwhyki5lqBmrT0m8Im+9I7PGFaraOzcYPtEz93RcsGY=
github.com/openshift/cluster-api-provider-openstack v0.5.1-0.20220113110629-19889578bf84 h1:lHIUlc0+eLjhEQWhnzhNQC4hdLOeIZt43J2m+wJZG/U=
github.com/openshift/cluster-api-provider-openstack v0.5.1-0.20220113110629-19889578bf84/go.mod h1:DjUUwFBscjYRihaHOXVMtNlBBazsstagsGO72TrqUik=
github.com/openshift/cluster-api-provider-openstack v0.5.1-0.20220401180447-6ba04de45920 h1:Rndj1qMh0iv0chWC3MIA86suaJU3bduZ1rgCEoxpPbg=
github.com/openshift/cluster-api-provider-openstack v0.5.1-0.20220401180447-6ba04de45920/go.mod h1:Ow4rYRzECW1yW2E/S9ly62ITYGaX47ZaN0IpWe0JsKM=
github.com/openshift/library-go v0.0.0-20211220195323-eca2c467c492 h1:oj/rSQqVWVj6YJUydZwLz2frrJreiyI4oa9g/YPgMsM=
github.com/openshift/library-go v0.0.0-20211220195323-eca2c467c492/go.mod h1:4UQ9snU1vg53fyTpHQw3vLPiAxI8ub5xrc+y8KPQQFs=
github.com/openshift/machine-api-operator v0.2.1-0.20211223185609-7ba373c29f8f h1:op3c+b/cPqdApZQUfueoSvBqIrqg772nXPe3pB+PFi4=
Expand Down Expand Up @@ -1215,6 +1219,8 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw=
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
Expand Down
44 changes: 21 additions & 23 deletions pkg/machine/actuator.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (

capov1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/compute"
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
capoRecorder "sigs.k8s.io/cluster-api-provider-openstack/pkg/record"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice 😀

openstackconfigv1 "github.com/openshift/machine-api-provider-openstack/pkg/apis/openstackproviderconfig/v1alpha1"
"github.com/openshift/machine-api-provider-openstack/pkg/clients"
Expand Down Expand Up @@ -65,6 +65,8 @@ type OpenstackClient struct {
}

func NewActuator(params ActuatorParams) (*OpenstackClient, error) {
capoRecorder.InitFromRecorder(params.EventRecorder)

return &OpenstackClient{
params: params,
client: params.Client,
Expand Down Expand Up @@ -125,7 +127,8 @@ func getInstanceStatus(osc *openStackContext, machine *machinev1.Machine) (*comp
return computeService.GetInstanceStatus(instanceID)
}

func (oc *OpenstackClient) convertMachineToCapoV1(osc *openStackContext, machine *machinev1.Machine) (*capov1.OpenStackMachine, error) {
func (oc *OpenstackClient) convertMachineToCapoInstanceSpec(osc *openStackContext, machine *machinev1.Machine) (*compute.InstanceSpec, error) {
providerSpec, err := clients.MachineSpecFromProviderSpec(machine.Spec.ProviderSpec)
clusterInfra, err := oc.params.ConfigClient.Infrastructures().Get(context.TODO(), "cluster", metav1.GetOptions{})
if err != nil {
return nil, fmt.Errorf("failed to retrieve cluster Infrastructure object: %v", err)
Expand All @@ -141,18 +144,23 @@ func (oc *OpenstackClient) convertMachineToCapoV1(osc *openStackContext, machine
return nil, err
}

// Convert to capov1
osMachine, err := NewOpenStackMachine(
userDataRendered, err := oc.getUserData(machine, providerSpec, oc.params.KubeClient)
if err != nil {
return nil, maoMachine.InvalidMachineConfiguration("error creating bootstrap for %s: %v", machine.Name, err)
}

// Convert to CAPO InstanceSpec
instanceSpec, err := MachineToInstanceSpec(
machine,
clusterInfra.Status.PlatformStatus.OpenStack.APIServerInternalIP,
clusterInfra.Status.PlatformStatus.OpenStack.IngressIP,
networkService, instanceService,
userDataRendered, networkService, instanceService,
)
if err != nil {
return nil, err
}

return osMachine, nil
return instanceSpec, nil
}

func (oc *OpenstackClient) Create(ctx context.Context, machine *machinev1.Machine) error {
Expand Down Expand Up @@ -185,7 +193,7 @@ func (oc *OpenstackClient) reconcile(ctx context.Context, machine *machinev1.Mac
// below and MAO will mark the machine failed on the next reconcile when
// Exists() returns false.
if instanceStatus == nil && machine.Spec.ProviderID == nil {
instanceStatus, err = oc.createInstance(ctx, machine, osc, providerSpec)
instanceStatus, err = oc.createInstance(ctx, machine, osc)
if err != nil {
return err
}
Expand Down Expand Up @@ -225,33 +233,24 @@ func (oc *OpenstackClient) reconcile(ctx context.Context, machine *machinev1.Mac
return nil
}

func (oc *OpenstackClient) createInstance(ctx context.Context, machine *machinev1.Machine, osc *openStackContext, providerSpec *openstackconfigv1.OpenstackProviderSpec) (*compute.InstanceStatus, error) {
func (oc *OpenstackClient) createInstance(ctx context.Context, machine *machinev1.Machine, osc *openStackContext) (*compute.InstanceStatus, error) {
if err := oc.validateMachine(machine); err != nil {
return nil, maoMachine.InvalidMachineConfiguration("Machine validation failed: %v", err)
}

userDataRendered, err := oc.getUserData(machine, providerSpec, oc.params.KubeClient)
if err != nil {
return nil, maoMachine.InvalidMachineConfiguration("error creating bootstrap for %s: %v", machine.Name, err)
}

osMachine, err := oc.convertMachineToCapoV1(osc, machine)
instanceSpec, err := oc.convertMachineToCapoInstanceSpec(osc, machine)
if err != nil {
return nil, err
}

// XXX(mdbooth): v1Machine is also used to set security group based on IsControlPlaneMachine
v1Machine := clusterv1.Machine{}
v1Machine.Spec.FailureDomain = &providerSpec.AvailabilityZone

computeService, err := osc.getComputeService()
if err != nil {
return nil, err
}

osCluster := getOSCluster()
clusterNameWithNamespace := utils.GetClusterNameWithNamespace(machine)
instanceStatus, err := computeService.CreateInstance(&osCluster, &v1Machine, osMachine, clusterNameWithNamespace, userDataRendered)
instanceStatus, err := computeService.CreateInstance(machine, &osCluster, instanceSpec, clusterNameWithNamespace)
if err != nil {
return nil, maoMachine.CreateMachine("error creating Openstack instance: %v", err)
}
Expand Down Expand Up @@ -281,7 +280,7 @@ func reconcileFloatingIP(machine *machinev1.Machine, providerSpec *openstackconf
return err
}
osCluster := getOSCluster()
fp, err := networkService.GetOrCreateFloatingIP(&osCluster, utils.GetClusterNameWithNamespace(machine), providerSpec.FloatingIP)
fp, err := networkService.GetOrCreateFloatingIP(machine, &osCluster, utils.GetClusterNameWithNamespace(machine), providerSpec.FloatingIP)
if err != nil {
return fmt.Errorf("get floatingIP err: %v", err)
}
Expand Down Expand Up @@ -319,13 +318,12 @@ func (oc *OpenstackClient) Delete(ctx context.Context, machine *machinev1.Machin
return err
}

osMachine, err := oc.convertMachineToCapoV1(osc, machine)
instanceSpec, err := oc.convertMachineToCapoInstanceSpec(osc, machine)
if err != nil {
return err
}

osCluster := getOSCluster()
err = computeService.DeleteInstance(&osCluster, &osMachine.Spec, machine.Name, instanceStatus)
err = computeService.DeleteInstance(machine, instanceSpec, instanceStatus)
if err != nil {
return err
}
Expand Down
99 changes: 37 additions & 62 deletions pkg/machine/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/openshift/machine-api-provider-openstack/pkg/clients"
"github.com/openshift/machine-api-provider-openstack/pkg/utils"
capov1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/compute"
"sigs.k8s.io/cluster-api-provider-openstack/pkg/cloud/services/networking"

openstackconfigv1 "github.com/openshift/machine-api-provider-openstack/pkg/apis/openstackproviderconfig/v1alpha1"
Expand All @@ -22,33 +23,6 @@ func NewOpenStackCluster(providerSpec *openstackconfigv1.OpenstackClusterProvide
}
}

func NewOpenStackMachine(machine *machinev1.Machine, apiVIP, ingressVIP string, networkService *networking.Service, instanceService *clients.InstanceService) (*capov1.OpenStackMachine, error) {
providerSpec, err := clients.MachineSpecFromProviderSpec(machine.Spec.ProviderSpec)
if err != nil {
return nil, err
}

// In OpenShift CAPO we've added additional tags to OpenStack resources and we should maintain that behavior.
injectDefaultTags(providerSpec, machine)

machineSpec, err := providerSpecToMachineSpec(providerSpec, apiVIP, ingressVIP, networkService, instanceService)
if err != nil {
return nil, err
}

osMachine := &capov1.OpenStackMachine{
ObjectMeta: machine.ObjectMeta,
Spec: machineSpec,
}

// if machine api master label exists, add v1beta control plane label to the node
if osMachine.ObjectMeta.Labels["machine.openshift.io/cluster-api-machine-role"] == "master" {
osMachine.ObjectMeta.Labels["cluster.x-k8s.io/control-plane"] = ""
}

return osMachine, nil
}

func clusterProviderSpecToClusterSpec(cps *openstackconfigv1.OpenstackClusterProviderSpec) capov1.OpenStackClusterSpec {
return capov1.OpenStackClusterSpec{
NodeCIDR: cps.NodeCIDR,
Expand Down Expand Up @@ -245,37 +219,40 @@ func networkParamToCapov1PortOpt(net *openstackconfigv1.NetworkParam, apiVIP, in
return ports, nil
}

func injectDefaultTags(ps *openstackconfigv1.OpenstackProviderSpec, machine *machinev1.Machine) {
func injectDefaultTags(instanceSpec *compute.InstanceSpec, machine *machinev1.Machine) {
defaultTags := []string{
"cluster-api-provider-openstack",
utils.GetClusterNameWithNamespace(machine),
}
ps.Tags = append(ps.Tags, defaultTags...)
instanceSpec.Tags = append(instanceSpec.Tags, defaultTags...)
}

func providerSpecToMachineSpec(ps *openstackconfigv1.OpenstackProviderSpec, apiVIP, ingressVIP string, networkService *networking.Service, instanceService *clients.InstanceService) (capov1.OpenStackMachineSpec, error) {
machineSpec := capov1.OpenStackMachineSpec{
CloudName: ps.CloudName,
Flavor: ps.Flavor,
func MachineToInstanceSpec(machine *machinev1.Machine, apiVIP, ingressVIP, userData string, networkService *networking.Service, instanceService *clients.InstanceService) (*compute.InstanceSpec, error) {
ps, err := clients.MachineSpecFromProviderSpec(machine.Spec.ProviderSpec)
if err != nil {
return nil, err
}

instanceSpec := compute.InstanceSpec{
Name: machine.Name,
Image: ps.Image,
Flavor: ps.Flavor,
SSHKeyName: ps.KeyName,
Networks: make([]capov1.NetworkParam, len(ps.Networks)),
Ports: make([]capov1.PortOpts, len(ps.Ports)),
FloatingIP: ps.FloatingIP,
SecurityGroups: make([]capov1.SecurityGroupParam, len(ps.SecurityGroups)),
Trunk: ps.Trunk,
UserData: userData,
Metadata: ps.ServerMetadata,
Tags: ps.Tags,
ServerMetadata: ps.ServerMetadata,
ConfigDrive: ps.ConfigDrive,
ConfigDrive: ps.ConfigDrive != nil && *ps.ConfigDrive,
FailureDomain: ps.AvailabilityZone,
ServerGroupID: ps.ServerGroupID,
IdentityRef: &capov1.OpenStackIdentityReference{
Kind: "secret",
Name: ps.CloudsSecret.Name,
},
Trunk: ps.Trunk,
Ports: make([]capov1.PortOpts, 0, len(ps.Ports)+len(ps.Networks)),
SecurityGroups: make([]capov1.SecurityGroupParam, len(ps.SecurityGroups)),
}

injectDefaultTags(&instanceSpec, machine)

if ps.RootVolume != nil {
machineSpec.RootVolume = &capov1.RootVolume{
instanceSpec.RootVolume = &capov1.RootVolume{
Size: ps.RootVolume.Size,
VolumeType: ps.RootVolume.VolumeType,
AvailabilityZone: ps.RootVolume.Zone,
Expand All @@ -285,39 +262,39 @@ func providerSpecToMachineSpec(ps *openstackconfigv1.OpenstackProviderSpec, apiV
// populate ps.RootVolume.SourceUUID. Moreover, according to the ClusterOSImage
// option definition this is always the name of the image and never the UUID.
// We should allow UUID at some point and this will need an update.
machineSpec.Image = ps.RootVolume.SourceUUID
instanceSpec.Image = ps.RootVolume.SourceUUID
}

if ps.ServerGroupName != "" && ps.ServerGroupID == "" {
// We assume that all the hard cases are covered by validation so here it's a matter of checking
// for existence of server group and creating it if it doesn't exist.
serverGroups, err := instanceService.GetServerGroupsByName(ps.ServerGroupName)
if err != nil {
return capov1.OpenStackMachineSpec{}, err
return nil, err
}
if len(serverGroups) == 1 {
machineSpec.ServerGroupID = serverGroups[0].ID
instanceSpec.ServerGroupID = serverGroups[0].ID
} else if len(serverGroups) == 0 {
serverGroup, err := instanceService.CreateServerGroup(ps.ServerGroupName)
if err != nil {
return capov1.OpenStackMachineSpec{}, fmt.Errorf("Error when creating a server group: %v", err)
return nil, fmt.Errorf("Error when creating a server group: %v", err)
}
machineSpec.ServerGroupID = serverGroup.ID
instanceSpec.ServerGroupID = serverGroup.ID
} else {
return capov1.OpenStackMachineSpec{}, fmt.Errorf("More than one server group of name %s exists", ps.ServerGroupName)
return nil, fmt.Errorf("More than one server group of name %s exists", ps.ServerGroupName)
}
}

for i, secGrp := range ps.SecurityGroups {
machineSpec.SecurityGroups[i] = capov1.SecurityGroupParam{
instanceSpec.SecurityGroups[i] = capov1.SecurityGroupParam{
UUID: secGrp.UUID,
Name: secGrp.Name,
Filter: capov1.SecurityGroupFilter(secGrp.Filter),
}
}

for i, port := range ps.Ports {
machineSpec.Ports[i] = capov1.PortOpts{
for _, port := range ps.Ports {
capoPort := capov1.PortOpts{
Network: &capov1.NetworkFilter{ID: port.NetworkID},
NameSuffix: port.NameSuffix,
Description: port.Description,
Expand All @@ -333,27 +310,25 @@ func providerSpecToMachineSpec(ps *openstackconfigv1.OpenstackProviderSpec, apiV
}

for fixedIPindex, fixedIP := range port.FixedIPs {
machineSpec.Ports[i].FixedIPs[fixedIPindex] = capov1.FixedIP{
capoPort.FixedIPs[fixedIPindex] = capov1.FixedIP{
Subnet: &capov1.SubnetFilter{ID: fixedIP.SubnetID},
IPAddress: fixedIP.IPAddress,
}
}

for addrPairIndex, addrPair := range port.AllowedAddressPairs {
machineSpec.Ports[i].AllowedAddressPairs[addrPairIndex] = capov1.AddressPair(addrPair)
capoPort.AllowedAddressPairs[addrPairIndex] = capov1.AddressPair(addrPair)
}
instanceSpec.Ports = append(instanceSpec.Ports, capoPort)
}

portList := []capov1.PortOpts{}
for _, network := range ps.Networks {
ports, err := networkParamToCapov1PortOpt(&network, apiVIP, ingressVIP, &ps.Trunk, networkService)
if err != nil {
return capov1.OpenStackMachineSpec{}, err
return nil, err
}
portList = append(portList, ports...)
instanceSpec.Ports = append(instanceSpec.Ports, ports...)
}

machineSpec.Ports = append(machineSpec.Ports, portList...)

return machineSpec, nil
return &instanceSpec, nil
}
Loading