talos/internal/integration/api/generate-config.go
Artem Chernyshev 0f924b5122 feat: add generate config gRPC API
Fixes: https://github.com/talos-systems/talos/issues/2766

This API is implemented in Maintenance and Machine services.
Can be used to generate configuration on the node, instead of using
talosctl to generate it locally.

To be used in interactive installer and talosctl gen config.

Signed-off-by: Artem Chernyshev <artem.0xD2@gmail.com>
2020-11-13 08:07:32 -08:00

95 lines
3.2 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// +build integration_api
package api
import (
"context"
"fmt"
"time"
"github.com/talos-systems/talos/internal/integration/base"
"github.com/talos-systems/talos/pkg/images"
machineapi "github.com/talos-systems/talos/pkg/machinery/api/machine"
"github.com/talos-systems/talos/pkg/machinery/config/configloader"
"github.com/talos-systems/talos/pkg/machinery/config/types/v1alpha1/machine"
"github.com/talos-systems/talos/pkg/machinery/constants"
)
// GenerateConfigSuite ...
type GenerateConfigSuite struct {
base.K8sSuite
ctx context.Context
ctxCancel context.CancelFunc
}
// SuiteName ...
func (suite *GenerateConfigSuite) SuiteName() string {
return "api.GenerateConfigSuite"
}
// SetupTest ...
func (suite *GenerateConfigSuite) SetupTest() {
// make sure we abort at some point in time, but give enough room for Recovers
suite.ctx, suite.ctxCancel = context.WithTimeout(context.Background(), 30*time.Minute)
}
// TearDownTest ...
func (suite *GenerateConfigSuite) TearDownTest() {
if suite.ctxCancel != nil {
suite.ctxCancel()
}
}
// TestGenerate verifies the generate config API.
func (suite *GenerateConfigSuite) TestGenerate() {
request := &machineapi.GenerateConfigurationRequest{
ConfigVersion: "v1alpha1",
MachineConfig: &machineapi.MachineConfig{
Type: machineapi.MachineConfig_MachineType(machine.TypeInit),
NetworkConfig: &machineapi.NetworkConfig{
Hostname: "testhost",
},
InstallConfig: &machineapi.InstallConfig{
InstallDisk: "/dev/sdb",
InstallImage: images.DefaultInstallerImage,
},
KubernetesVersion: constants.DefaultKubernetesVersion,
},
ClusterConfig: &machineapi.ClusterConfig{
Name: "talos-default",
ControlPlane: &machineapi.ControlPlaneConfig{
Endpoint: "http://localhost",
},
ClusterNetwork: &machineapi.ClusterNetworkConfig{
DnsDomain: "cluster.test",
},
},
}
reply, err := suite.Client.GenerateConfiguration(
suite.ctx,
request,
)
suite.Require().NoError(err)
config, err := configloader.NewFromBytes(reply.GetData()[0])
suite.Require().NoError(err)
suite.Require().EqualValues(config.Machine().Type(), request.MachineConfig.Type)
suite.Require().EqualValues(config.Version(), request.ConfigVersion)
suite.Require().EqualValues(config.Cluster().Name(), request.ClusterConfig.Name)
suite.Require().EqualValues(config.Cluster().Endpoint(), request.ClusterConfig.ControlPlane.Endpoint)
suite.Require().EqualValues(config.Cluster().Network().DNSDomain(), request.ClusterConfig.ClusterNetwork.DnsDomain)
suite.Require().EqualValues(config.Machine().Kubelet().Image(), fmt.Sprintf("%s:%s", constants.KubeletImage, request.MachineConfig.KubernetesVersion))
suite.Require().EqualValues(config.Machine().Install().Disk(), request.MachineConfig.InstallConfig.InstallDisk)
suite.Require().EqualValues(config.Machine().Install().Image(), request.MachineConfig.InstallConfig.InstallImage)
suite.Require().EqualValues(config.Machine().Network().Hostname(), request.MachineConfig.NetworkConfig.Hostname)
}