1
// This Source Code Form is subject to the terms of the Mozilla Public
2
// License, v. 2.0. If a copy of the MPL was not distributed with this
3
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
"github.com/siderolabs/talos/pkg/machinery/config/generate"
11
"github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1"
12
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
13
"github.com/siderolabs/talos/pkg/provision"
14
"github.com/siderolabs/talos/pkg/provision/providers/vm"
17
type provisioner struct {
21
// NewProvisioner initializes qemu provisioner.
22
func NewProvisioner(ctx context.Context) (provision.Provisioner, error) {
32
// Close and release resources.
33
func (p *provisioner) Close() error {
37
// GenOptions provides a list of additional config generate options.
38
func (p *provisioner) GenOptions(networkReq provision.NetworkRequest) []generate.Option {
42
for _, cidr := range networkReq.CIDRs {
43
if cidr.Addr().Is6() {
50
virtioSelector := v1alpha1.IfaceBySelector(v1alpha1.NetworkDeviceSelector{
51
NetworkDeviceKernelDriver: "virtio_net",
54
return []generate.Option{
55
generate.WithInstallDisk("/dev/vda"),
56
generate.WithInstallExtraKernelArgs([]string{
57
"console=ttyS0", // TODO: should depend on arch
58
// reboot configuration
61
"talos.shutdown=halt",
63
"talos.platform=metal",
65
generate.WithNetworkOptions(
66
v1alpha1.WithNetworkInterfaceDHCP(virtioSelector, true),
67
v1alpha1.WithNetworkInterfaceDHCPv4(virtioSelector, hasIPv4),
68
v1alpha1.WithNetworkInterfaceDHCPv6(virtioSelector, hasIPv6),
73
// GetInClusterKubernetesControlPlaneEndpoint returns the Kubernetes control plane endpoint.
74
func (p *provisioner) GetInClusterKubernetesControlPlaneEndpoint(networkReq provision.NetworkRequest, controlPlanePort int) string {
75
// QEMU provisioner always runs TCP loadbalancer on the bridge IP and port 6443.
76
return "https://" + nethelpers.JoinHostPort(networkReq.GatewayAddrs[0].String(), controlPlanePort)
79
// GetExternalKubernetesControlPlaneEndpoint returns the Kubernetes control plane endpoint.
80
func (p *provisioner) GetExternalKubernetesControlPlaneEndpoint(networkReq provision.NetworkRequest, controlPlanePort int) string {
81
// for QEMU, external and in-cluster endpoints are same.
82
return p.GetInClusterKubernetesControlPlaneEndpoint(networkReq, controlPlanePort)
85
// GetTalosAPIEndpoints returns a list of Talos API endpoints.
86
func (p *provisioner) GetTalosAPIEndpoints(provision.NetworkRequest) []string {
87
// nil means that the API of controlplane endpoints should be used
91
// GetFirstInterface returns first network interface name.
92
func (p *provisioner) GetFirstInterface() v1alpha1.IfaceSelector {
93
return v1alpha1.IfaceBySelector(v1alpha1.NetworkDeviceSelector{
94
NetworkDeviceKernelDriver: "virtio_net",