talos

Форк
0
96 строк · 3.0 Кб
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/.
4

5
package qemu
6

7
import (
8
	"context"
9

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"
15
)
16

17
type provisioner struct {
18
	vm.Provisioner
19
}
20

21
// NewProvisioner initializes qemu provisioner.
22
func NewProvisioner(ctx context.Context) (provision.Provisioner, error) {
23
	p := &provisioner{
24
		vm.Provisioner{
25
			Name: "qemu",
26
		},
27
	}
28

29
	return p, nil
30
}
31

32
// Close and release resources.
33
func (p *provisioner) Close() error {
34
	return nil
35
}
36

37
// GenOptions provides a list of additional config generate options.
38
func (p *provisioner) GenOptions(networkReq provision.NetworkRequest) []generate.Option {
39
	hasIPv4 := false
40
	hasIPv6 := false
41

42
	for _, cidr := range networkReq.CIDRs {
43
		if cidr.Addr().Is6() {
44
			hasIPv6 = true
45
		} else {
46
			hasIPv4 = true
47
		}
48
	}
49

50
	virtioSelector := v1alpha1.IfaceBySelector(v1alpha1.NetworkDeviceSelector{
51
		NetworkDeviceKernelDriver: "virtio_net",
52
	})
53

54
	return []generate.Option{
55
		generate.WithInstallDisk("/dev/vda"),
56
		generate.WithInstallExtraKernelArgs([]string{
57
			"console=ttyS0", // TODO: should depend on arch
58
			// reboot configuration
59
			"reboot=k",
60
			"panic=1",
61
			"talos.shutdown=halt",
62
			// Talos-specific
63
			"talos.platform=metal",
64
		}),
65
		generate.WithNetworkOptions(
66
			v1alpha1.WithNetworkInterfaceDHCP(virtioSelector, true),
67
			v1alpha1.WithNetworkInterfaceDHCPv4(virtioSelector, hasIPv4),
68
			v1alpha1.WithNetworkInterfaceDHCPv6(virtioSelector, hasIPv6),
69
		),
70
	}
71
}
72

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)
77
}
78

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)
83
}
84

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
88
	return nil
89
}
90

91
// GetFirstInterface returns first network interface name.
92
func (p *provisioner) GetFirstInterface() v1alpha1.IfaceSelector {
93
	return v1alpha1.IfaceBySelector(v1alpha1.NetworkDeviceSelector{
94
		NetworkDeviceKernelDriver: "virtio_net",
95
	})
96
}
97

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.