diff --git a/runner/providers/lxd/lxd.go b/runner/providers/lxd/lxd.go index e76c30e6..8b56098d 100644 --- a/runner/providers/lxd/lxd.go +++ b/runner/providers/lxd/lxd.go @@ -208,7 +208,7 @@ func (l *LXD) secureBootEnabled() string { return "false" } -func (l *LXD) getCreateInstanceArgs(bootstrapParams params.BootstrapInstance) (api.InstancesPost, error) { +func (l *LXD) getCreateInstanceArgs(bootstrapParams params.BootstrapInstance, specs extraSpecs) (api.InstancesPost, error) { if bootstrapParams.Name == "" { return api.InstancesPost{}, runnerErrors.NewBadRequestError("missing name") } @@ -233,6 +233,7 @@ func (l *LXD) getCreateInstanceArgs(bootstrapParams params.BootstrapInstance) (a return api.InstancesPost{}, errors.Wrap(err, "getting tools") } + bootstrapParams.UserDataOptions.DisableUpdatesOnBoot = specs.DisableUpdates cloudCfg, err := util.GetCloudConfig(bootstrapParams, tools, bootstrapParams.Name) if err != nil { return api.InstancesPost{}, errors.Wrap(err, "generating cloud-config") @@ -310,7 +311,11 @@ func (l *LXD) launchInstance(createArgs api.InstancesPost) error { // CreateInstance creates a new compute instance in the provider. func (l *LXD) CreateInstance(ctx context.Context, bootstrapParams params.BootstrapInstance) (params.Instance, error) { - args, err := l.getCreateInstanceArgs(bootstrapParams) + extraSpecs, err := parseExtraSpecsFromBootstrapParams(bootstrapParams) + if err != nil { + return params.Instance{}, errors.Wrap(err, "parsing extra specs") + } + args, err := l.getCreateInstanceArgs(bootstrapParams, extraSpecs) if err != nil { return params.Instance{}, errors.Wrap(err, "fetching create args") } diff --git a/runner/providers/lxd/specs.go b/runner/providers/lxd/specs.go new file mode 100644 index 00000000..21470c11 --- /dev/null +++ b/runner/providers/lxd/specs.go @@ -0,0 +1,38 @@ +// Copyright 2023 Cloudbase Solutions SRL +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package lxd + +import ( + "encoding/json" + + "github.com/cloudbase/garm/params" + "github.com/pkg/errors" +) + +type extraSpecs struct { + DisableUpdates bool `json:"disable_updates"` +} + +func parseExtraSpecsFromBootstrapParams(bootstrapParams params.BootstrapInstance) (extraSpecs, error) { + specs := extraSpecs{} + if bootstrapParams.ExtraSpecs == nil { + return specs, nil + } + + if err := json.Unmarshal(bootstrapParams.ExtraSpecs, &specs); err != nil { + return specs, errors.Wrap(err, "unmarshaling extra specs") + } + return specs, nil +}