diff --git a/Dockerfile b/Dockerfile index bb4e5f450..411e72c3f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -253,7 +253,7 @@ COPY --from=fmt-build /src / # # The markdownlint target performs linting on Markdown files. # -FROM node:17.3.1-alpine AS lint-markdown +FROM node:17.4.0-alpine AS lint-markdown RUN apk add --no-cache findutils RUN npm i -g markdownlint-cli@0.23.2 RUN npm i -g textlint@11.7.6 diff --git a/app/sidero-controller-manager/api/v1alpha1/server_types.go b/app/sidero-controller-manager/api/v1alpha1/server_types.go index 32641a8e5..2811a5664 100644 --- a/app/sidero-controller-manager/api/v1alpha1/server_types.go +++ b/app/sidero-controller-manager/api/v1alpha1/server_types.go @@ -14,6 +14,8 @@ import ( "k8s.io/apimachinery/pkg/types" clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" + + siderotypes "github.com/talos-systems/sidero/app/sidero-controller-manager/pkg/types" ) // BMC defines data about how to talk to the node via ipmitool. @@ -155,6 +157,13 @@ type ServerSpec struct { Accepted bool `json:"accepted"` Cordoned bool `json:"cordoned,omitempty"` PXEBootAlways bool `json:"pxeBootAlways,omitempty"` + // BootFromDiskMethod specifies the method to exit iPXE to force boot from disk. + // + // If not set, controller default is used. + // Valid values: ipxe-exit, http-404, ipxe-sanboot. + // + // +optional + BootFromDiskMethod siderotypes.BootFromDisk `json:"bootFromDiskMethod,omitempty"` } const ( diff --git a/app/sidero-controller-manager/api/v1alpha1/serverclass_types.go b/app/sidero-controller-manager/api/v1alpha1/serverclass_types.go index 522ee3a63..0ff656bf9 100644 --- a/app/sidero-controller-manager/api/v1alpha1/serverclass_types.go +++ b/app/sidero-controller-manager/api/v1alpha1/serverclass_types.go @@ -7,6 +7,8 @@ package v1alpha1 import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + siderotypes "github.com/talos-systems/sidero/app/sidero-controller-manager/pkg/types" ) // ServerClassAny is an automatically created ServerClass that includes all Servers. @@ -37,6 +39,13 @@ type ServerClassSpec struct { // Set of config patches to apply to the machine configuration to the servers provisioned via this server class. // +optional ConfigPatches []ConfigPatches `json:"configPatches,omitempty"` + // BootFromDiskMethod specifies the method to exit iPXE to force boot from disk. + // + // If not set, controller default is used. + // Valid values: ipxe-exit, http-404, ipxe-sanboot. + // + // +optional + BootFromDiskMethod siderotypes.BootFromDisk `json:"bootFromDiskMethod,omitempty"` } // ServerClassStatus defines the observed state of ServerClass. diff --git a/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_serverclasses.yaml b/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_serverclasses.yaml index 98b971c52..ba4361a91 100644 --- a/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_serverclasses.yaml +++ b/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_serverclasses.yaml @@ -49,6 +49,11 @@ spec: spec: description: ServerClassSpec defines the desired state of ServerClass. properties: + bootFromDiskMethod: + description: "BootFromDiskMethod specifies the method to exit iPXE + to force boot from disk. \n If not set, controller default is used. + Valid values: ipxe-exit, http-404, ipxe-sanboot." + type: string configPatches: description: Set of config patches to apply to the machine configuration to the servers provisioned via this server class. diff --git a/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_servers.yaml b/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_servers.yaml index f73dfc9d3..4591ba63c 100644 --- a/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_servers.yaml +++ b/app/sidero-controller-manager/config/crd/bases/metal.sidero.dev_servers.yaml @@ -142,6 +142,11 @@ spec: required: - endpoint type: object + bootFromDiskMethod: + description: "BootFromDiskMethod specifies the method to exit iPXE + to force boot from disk. \n If not set, controller default is used. + Valid values: ipxe-exit, http-404, ipxe-sanboot." + type: string configPatches: items: properties: diff --git a/app/sidero-controller-manager/internal/ipxe/ipxe_server.go b/app/sidero-controller-manager/internal/ipxe/ipxe_server.go index 52baafa8c..8fd9e3f36 100644 --- a/app/sidero-controller-manager/internal/ipxe/ipxe_server.go +++ b/app/sidero-controller-manager/internal/ipxe/ipxe_server.go @@ -35,6 +35,7 @@ import ( metalv1alpha1 "github.com/talos-systems/sidero/app/sidero-controller-manager/api/v1alpha1" "github.com/talos-systems/sidero/app/sidero-controller-manager/internal/siderolink" "github.com/talos-systems/sidero/app/sidero-controller-manager/pkg/constants" + siderotypes "github.com/talos-systems/sidero/app/sidero-controller-manager/pkg/types" ) var ErrBootFromDisk = errors.New("boot from disk") @@ -110,20 +111,11 @@ const ipxeBootFromDiskSanboot = `#!ipxe sanboot --no-describe --drive 0x80 ` -// BootFromDisk defines a way to boot from disk. -type BootFromDisk string - -const ( - BootIPXEExit BootFromDisk = "ipxe-exit" // Use iPXE script with `exit` command. - Boot404 BootFromDisk = "http-404" // Return HTTP 404 response to iPXE. - BootSANDisk BootFromDisk = "ipxe-sanboot" // Use iPXE script with `sanboot` command. -) - var ( apiEndpoint string apiPort int extraAgentKernelArgs string - defaultBootFromDiskMethod BootFromDisk + defaultBootFromDiskMethod siderotypes.BootFromDisk c client.Client ) @@ -132,13 +124,13 @@ func bootFileHandler(w http.ResponseWriter, r *http.Request) { } //nolint:unparam -func bootFromDiskHandler(method BootFromDisk, w http.ResponseWriter, r *http.Request) { - switch method { //nolint:exhaustive - case Boot404: +func bootFromDiskHandler(method siderotypes.BootFromDisk, w http.ResponseWriter, r *http.Request) { + switch method { + case siderotypes.Boot404: w.WriteHeader(http.StatusNotFound) - case BootSANDisk: + case siderotypes.BootSANDisk: fmt.Fprint(w, ipxeBootFromDiskSanboot) - case BootIPXEExit: + case siderotypes.BootIPXEExit: fallthrough default: fmt.Fprint(w, ipxeBootFromDiskExit) @@ -173,7 +165,16 @@ func ipxeHandler(w http.ResponseWriter, r *http.Request) { if err != nil { if errors.Is(err, ErrBootFromDisk) { log.Printf("Server %q booting from disk", uuid) - bootFromDiskHandler(defaultBootFromDiskMethod, w, r) + + method, err := getBootFromDiskMethod(server, serverBinding) + if err != nil { + log.Printf("%v", err) + w.WriteHeader(http.StatusInternalServerError) + + return + } + + bootFromDiskHandler(method, w, r) return } @@ -248,9 +249,36 @@ func ipxeHandler(w http.ResponseWriter, r *http.Request) { } } +func getBootFromDiskMethod(server *metalv1alpha1.Server, serverBinding *infrav1.ServerBinding) (siderotypes.BootFromDisk, error) { + method := defaultBootFromDiskMethod + + if server.Spec.BootFromDiskMethod != "" { + method = server.Spec.BootFromDiskMethod + } else if serverBinding.Spec.ServerClassRef != nil { + var serverClass metalv1alpha1.ServerClass + + if err := c.Get( + context.TODO(), + types.NamespacedName{ + Namespace: serverBinding.Spec.ServerClassRef.Namespace, + Name: serverBinding.Spec.ServerClassRef.Name, + }, + &serverClass, + ); err != nil { + return "", err + } + + if serverClass.Spec.BootFromDiskMethod != "" { + method = serverClass.Spec.BootFromDiskMethod + } + } + + return method, nil +} + var embeddedScriptBuf bytes.Buffer -func RegisterIPXE(mux *http.ServeMux, endpoint string, port int, args string, bootMethod BootFromDisk, iPXEPort int, mgrClient client.Client) error { +func RegisterIPXE(mux *http.ServeMux, endpoint string, port int, args string, bootMethod siderotypes.BootFromDisk, iPXEPort int, mgrClient client.Client) error { apiEndpoint = endpoint apiPort = port extraAgentKernelArgs = args diff --git a/app/sidero-controller-manager/main.go b/app/sidero-controller-manager/main.go index 649276da1..524d05e6e 100644 --- a/app/sidero-controller-manager/main.go +++ b/app/sidero-controller-manager/main.go @@ -40,6 +40,7 @@ import ( "github.com/talos-systems/sidero/app/sidero-controller-manager/internal/siderolink" "github.com/talos-systems/sidero/app/sidero-controller-manager/internal/tftp" "github.com/talos-systems/sidero/app/sidero-controller-manager/pkg/constants" + siderotypes "github.com/talos-systems/sidero/app/sidero-controller-manager/pkg/types" "github.com/talos-systems/sidero/internal/client" // +kubebuilder:scaffold:imports ) @@ -93,7 +94,7 @@ func main() { flag.StringVar(&metricsAddr, "metrics-bind-addr", ":8081", "The address the metric endpoint binds to.") flag.StringVar(&healthAddr, "health-addr", ":9440", "The address the health endpoint binds to.") flag.StringVar(&extraAgentKernelArgs, "extra-agent-kernel-args", "", "A list of Linux kernel command line arguments to add to the agent environment kernel parameters (e.g. 'console=tty1 console=ttyS1').") - flag.StringVar(&bootFromDiskMethod, "boot-from-disk-method", string(ipxe.BootIPXEExit), "Default method to use to boot server from disk if it hits iPXE endpoint after install.") + flag.StringVar(&bootFromDiskMethod, "boot-from-disk-method", string(siderotypes.BootIPXEExit), "Default method to use to boot server from disk if it hits iPXE endpoint after install.") flag.BoolVar(&enableLeaderElection, "enable-leader-election", true, "Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.") flag.BoolVar(&autoAcceptServers, "auto-accept-servers", false, "Add servers as 'accepted' when they register with Sidero API.") flag.BoolVar(&insecureWipe, "insecure-wipe", true, "Wipe head of the disk only (if false, wipe whole disk).") @@ -235,7 +236,7 @@ func main() { setupLog.Info("starting iPXE server") - if err := ipxe.RegisterIPXE(httpMux, apiEndpoint, apiPort, extraAgentKernelArgs, ipxe.BootFromDisk(bootFromDiskMethod), apiPort, mgr.GetClient()); err != nil { + if err := ipxe.RegisterIPXE(httpMux, apiEndpoint, apiPort, extraAgentKernelArgs, siderotypes.BootFromDisk(bootFromDiskMethod), apiPort, mgr.GetClient()); err != nil { setupLog.Error(err, "unable to start iPXE server", "controller", "Environment") os.Exit(1) } diff --git a/app/sidero-controller-manager/pkg/types/types.go b/app/sidero-controller-manager/pkg/types/types.go new file mode 100644 index 000000000..96a883386 --- /dev/null +++ b/app/sidero-controller-manager/pkg/types/types.go @@ -0,0 +1,14 @@ +// 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/. + +package types + +// BootFromDisk defines a way to boot from disk. +type BootFromDisk string + +const ( + BootIPXEExit BootFromDisk = "ipxe-exit" // Use iPXE script with `exit` command. + Boot404 BootFromDisk = "http-404" // Return HTTP 404 response to iPXE. + BootSANDisk BootFromDisk = "ipxe-sanboot" // Use iPXE script with `sanboot` command. +) diff --git a/go.mod b/go.mod index ac62b2b94..11e02dbea 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/hashicorp/go-multierror v1.1.1 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.17.0 + github.com/onsi/gomega v1.18.1 github.com/pensando/goipmi v0.0.0-20200303170213-e858ec1cf0b5 github.com/pin/tftp v2.1.1-0.20200117065540-2f79be2dba4e+incompatible github.com/pkg/errors v0.9.1 @@ -29,11 +29,11 @@ require ( github.com/talos-systems/siderolink v0.1.1-0.20211130121818-9902ad2774f0 github.com/talos-systems/talos/pkg/machinery v0.14.1 go.uber.org/zap v1.20.0 - golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 + golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20211230205640-daad0b7ba671 - google.golang.org/grpc v1.43.0 + google.golang.org/grpc v1.44.0 google.golang.org/protobuf v1.27.1 inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6 k8s.io/api v0.22.2 @@ -100,7 +100,7 @@ require ( golang.org/x/crypto v0.0.0-20211202192323-5770296d904e // indirect golang.org/x/mod v0.5.1 // indirect golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect - golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect golang.org/x/tools v0.1.8 // indirect diff --git a/go.sum b/go.sum index 41c93920e..a41996162 100644 --- a/go.sum +++ b/go.sum @@ -308,6 +308,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -512,14 +513,17 @@ github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvw github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d h1:pNa8metDkwZjb9g4T8s+krQ+HRgZAkqnXml+wNir/+s= @@ -849,8 +853,8 @@ golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d h1:1n1fc535VhN8SYtD4cDUyNlfpAF2ROMM9+11equK3hs= -golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -977,13 +981,15 @@ golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211214234402-4825e8c3871d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1206,8 +1212,8 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/hack/release.toml b/hack/release.toml index b631d884c..3e127621e 100644 --- a/hack/release.toml +++ b/hack/release.toml @@ -71,4 +71,10 @@ fails on the node. description = """\ Sidero server controller now keeps track of Talos installation progress. Now the node will be PXE booted until Talos installation succeeds. +""" + + [notes.bootfromdisk] + title = "iPXE Boot From Disk Method" + description = """\ +iPXE boot from disk method can now be set not only on the global level, but also in the Server and ServerClass specs. """ diff --git a/sfyra/go.mod b/sfyra/go.mod index 2628224e7..3d7c366e2 100644 --- a/sfyra/go.mod +++ b/sfyra/go.mod @@ -24,7 +24,7 @@ require ( github.com/talos-systems/sidero v0.0.0-00010101000000-000000000000 github.com/talos-systems/talos v0.14.1 github.com/talos-systems/talos/pkg/machinery v0.14.1 - google.golang.org/grpc v1.43.0 + google.golang.org/grpc v1.44.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b k8s.io/api v0.23.1 k8s.io/apiextensions-apiserver v0.23.1 @@ -113,7 +113,7 @@ require ( github.com/mitchellh/mapstructure v1.4.3 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/onsi/gomega v1.17.0 // indirect + github.com/onsi/gomega v1.18.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect github.com/pelletier/go-toml v1.9.4 // indirect @@ -140,10 +140,10 @@ require ( go.opencensus.io v0.23.0 // indirect golang.org/x/crypto v0.0.0-20211202192323-5770296d904e // indirect golang.org/x/mod v0.5.1 // indirect - golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d // indirect + golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect + golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect diff --git a/sfyra/go.sum b/sfyra/go.sum index d84ec9282..403c405d1 100644 --- a/sfyra/go.sum +++ b/sfyra/go.sum @@ -567,6 +567,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -881,6 +882,8 @@ github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvw github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -890,8 +893,9 @@ github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDs github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1397,8 +1401,8 @@ golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d h1:1n1fc535VhN8SYtD4cDUyNlfpAF2ROMM9+11equK3hs= -golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1564,8 +1568,9 @@ golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211214234402-4825e8c3871d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1824,8 +1829,8 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/website/content/docs/v0.5/Resource Configuration/serverclasses.md b/website/content/docs/v0.5/Resource Configuration/serverclasses.md index 2ed27f22c..272bdb858 100644 --- a/website/content/docs/v0.5/Resource Configuration/serverclasses.md +++ b/website/content/docs/v0.5/Resource Configuration/serverclasses.md @@ -80,3 +80,38 @@ spec: path: /machine/install/disk value: /dev/sda ``` + +## Other Settings + +### `environmentRef` + +Servers from a `ServerClass` can be set to use the specific `Environment` by linking the `Environment` from the `ServerClass`: + +```yaml +apiVersion: metal.sidero.dev/v1alpha1 +kind: ServerClass +... +spec: + environmentRef: + name: production-env +``` + +### `bootFromDiskMethod` + +The method to exit iPXE network boot to force boot from disk can be configured for all `Server` resources belonging to the `ServerClass`: + +```yaml +apiVersion: metal.sidero.dev/v1alpha1 +kind: ServerClass +... +spec: + bootFromDiskMethod: ipxe-sanboot +``` + +Valid values are: + +- `ipxe-exit` +- `http-404` +- `ipxe-sanboot` + +If not set, the default boot from disk method is used (`SIDERO_CONTROLLER_MANAGER_BOOT_FROM_DISK_METHOD`). diff --git a/website/content/docs/v0.5/Resource Configuration/servers.md b/website/content/docs/v0.5/Resource Configuration/servers.md index ee356bcdb..969991765 100644 --- a/website/content/docs/v0.5/Resource Configuration/servers.md +++ b/website/content/docs/v0.5/Resource Configuration/servers.md @@ -132,3 +132,52 @@ spec: ``` As the `Server` resource is not namespaced, `Secret` should be created in the `default` namespace. + +## Other Settings + +### `cordoned` + +If `cordoned` is set to `true`, `Server` gets excluded from any `ServerClass` it might match based on qualifiers. +This means that the `Server` will not be allocated automatically. + +`Server` might be `cordoned` to temporarily take it out of the `ServerClass` to perform for example hardware maintenance. + +```yaml +apiVersion: metal.sidero.dev/v1alpha1 +kind: Server +... +spec: + cordoned: true +``` + +### `pxeBootAlways` + +`Server` might be forced to boot from the network even if the OS is already installed with `pxeBootAlways: true`: + +```yaml +apiVersion: metal.sidero.dev/v1alpha1 +kind: Server +... +spec: + pxeBootAlways: true +``` + +### `bootFromDiskMethod` + +The method to exit iPXE network boot to force boot from disk can be configured for the `Server`: + +```yaml +apiVersion: metal.sidero.dev/v1alpha1 +kind: Server +... +spec: + bootFromDiskMethod: ipxe-sanboot +``` + +Valid values are: + +- `ipxe-exit` +- `http-404` +- `ipxe-sanboot` + +If not set, the `ServerClass.spec.bootFromDiskMethod` value is used with the fallback to the default boot from disk method (`SIDERO_CONTROLLER_MANAGER_BOOT_FROM_DISK_METHOD`).