mirror of https://github.com/kubernetes/kops.git
Remove nodeup's unused cloudinit target
This commit is contained in:
parent
9aa2a5104a
commit
76fc186060
|
@ -49,7 +49,7 @@ func main() {
|
|||
flag.StringVar(&flagCacheDir, "cache", "/var/cache/nodeup", "the location for the local asset cache")
|
||||
flag.IntVar(&flagRetries, "retries", -1, "maximum number of retries on failure: -1 means retry forever")
|
||||
flag.BoolVar(&dryrun, "dryrun", false, "Don't create cloud resources; just show what would be done")
|
||||
flag.StringVar(&target, "target", target, "Target - direct, cloudinit")
|
||||
flag.StringVar(&target, "target", target, "Target - direct, dryrun")
|
||||
flag.BoolVar(&installSystemdUnit, "install-systemd-unit", installSystemdUnit, "If true, will install a systemd unit instead of running directly")
|
||||
|
||||
if dryrun {
|
||||
|
|
|
@ -1,184 +0,0 @@
|
|||
/*
|
||||
Copyright 2019 The Kubernetes Authors.
|
||||
|
||||
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 cloudinit
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/utils"
|
||||
)
|
||||
|
||||
type CloudInitTarget struct {
|
||||
Config *CloudConfig
|
||||
out io.Writer
|
||||
}
|
||||
|
||||
type AddBehaviour int
|
||||
|
||||
const (
|
||||
Always AddBehaviour = iota
|
||||
Once
|
||||
)
|
||||
|
||||
func NewCloudInitTarget(out io.Writer) *CloudInitTarget {
|
||||
t := &CloudInitTarget{
|
||||
Config: &CloudConfig{},
|
||||
out: out,
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
var _ fi.NodeupTarget = &CloudInitTarget{}
|
||||
|
||||
type CloudConfig struct {
|
||||
PackageUpdate bool `json:"package_update"`
|
||||
|
||||
Packages []string `json:"packages,omitempty"`
|
||||
RunCommmands [][]string `json:"runcmd,omitempty"`
|
||||
WriteFiles []*CloudConfigFile `json:"write_files,omitempty"`
|
||||
}
|
||||
|
||||
type CloudConfigFile struct {
|
||||
Encoding string `json:"encoding,omitempty"`
|
||||
Owner string `json:"owner,omitempty"`
|
||||
Path string `json:"path,omitempty"`
|
||||
Permissions string `json:"permissions,omitempty"`
|
||||
Content string `json:"content,omitempty"`
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) ProcessDeletions() bool {
|
||||
// We don't expect any, but it would be our job to process them
|
||||
return true
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) AddMkdirpCommand(p string, dirMode os.FileMode) {
|
||||
t.AddCommand(Once, "mkdir", "-p", "-m", fi.FileModeToString(dirMode), p)
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) AddDownloadCommand(addBehaviour AddBehaviour, url string, dest string) {
|
||||
// TODO: Create helper to download reliably and validate hash?
|
||||
// ... but then why not just use cloudup :-)
|
||||
t.AddCommand(addBehaviour, "curl", "-f", "--ipv4", "-Lo", dest, "--connect-timeout", "20", "--retry", "6", "--retry-delay", "10", url)
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) fetch(p *fi.Source, destPath string) {
|
||||
// We could probably move this to fi.Source - it is likely to be the same for every provider
|
||||
if p.URL != "" {
|
||||
if p.Parent != nil {
|
||||
klog.Fatalf("unexpected parent with SourceURL in FetchInstructions: %v", p)
|
||||
}
|
||||
t.AddDownloadCommand(Once, p.URL, destPath)
|
||||
} else if p.ExtractFromArchive != "" {
|
||||
if p.Parent == nil {
|
||||
klog.Fatalf("unexpected ExtractFromArchive without parent in FetchInstructions: %v", p)
|
||||
}
|
||||
|
||||
// TODO: Remove duplicate commands?
|
||||
archivePath := "/tmp/" + utils.SanitizeString(p.Parent.Key())
|
||||
t.fetch(p.Parent, archivePath)
|
||||
|
||||
extractDir := "/tmp/extracted_" + utils.SanitizeString(p.Parent.Key())
|
||||
t.AddMkdirpCommand(extractDir, 0o755)
|
||||
t.AddCommand(Once, "tar", "zxf", archivePath, "-C", extractDir)
|
||||
|
||||
// Always because this shouldn't happen and we want an indication that it happened
|
||||
t.AddCommand(Always, "cp", path.Join(extractDir, p.ExtractFromArchive), destPath)
|
||||
} else {
|
||||
klog.Fatalf("unknown FetchInstructions: %v", p)
|
||||
}
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) WriteFile(destPath string, contents fi.Resource, fileMode os.FileMode, dirMode os.FileMode) error {
|
||||
var p *fi.Source
|
||||
|
||||
if hs, ok := contents.(fi.HasSource); ok {
|
||||
p = hs.GetSource()
|
||||
}
|
||||
|
||||
if p != nil {
|
||||
t.AddMkdirpCommand(path.Dir(destPath), dirMode)
|
||||
t.fetch(p, destPath)
|
||||
} else {
|
||||
// TODO: No way to specify parent dir permissions?
|
||||
f := &CloudConfigFile{
|
||||
Encoding: "b64",
|
||||
Owner: "root:root",
|
||||
Permissions: fi.FileModeToString(fileMode),
|
||||
Path: destPath,
|
||||
}
|
||||
|
||||
d, err := fi.ResourceAsBytes(contents)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Not a strict limit, just a sanity check
|
||||
if len(d) > 256*1024 {
|
||||
return fmt.Errorf("resource is very large (failed sanity-check): %v", contents)
|
||||
}
|
||||
|
||||
f.Content = base64.StdEncoding.EncodeToString(d)
|
||||
|
||||
t.Config.WriteFiles = append(t.Config.WriteFiles, f)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) Chown(path string, user, group string) {
|
||||
t.AddCommand(Always, "chown", user+":"+group, path)
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) AddCommand(addBehaviour AddBehaviour, args ...string) {
|
||||
switch addBehaviour {
|
||||
case Always:
|
||||
break
|
||||
|
||||
case Once:
|
||||
for _, c := range t.Config.RunCommmands {
|
||||
if utils.StringSlicesEqual(args, c) {
|
||||
klog.V(2).Infof("skipping pre-existing command because AddBehaviour=Once: %q", args)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
klog.Fatalf("unknown AddBehaviour: %v", addBehaviour)
|
||||
}
|
||||
|
||||
t.Config.RunCommmands = append(t.Config.RunCommmands, args)
|
||||
}
|
||||
|
||||
func (t *CloudInitTarget) Finish(taskMap map[string]fi.NodeupTask) error {
|
||||
d, err := utils.YamlMarshal(t.Config)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error serializing config to yaml: %v", err)
|
||||
}
|
||||
|
||||
conf := "#cloud-config\n" + string(d)
|
||||
|
||||
_, err = t.out.Write([]byte(conf))
|
||||
if err != nil {
|
||||
return fmt.Errorf("error writing cloud-init data to output: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -54,7 +54,6 @@ import (
|
|||
"k8s.io/kops/upup/pkg/fi/cloudup/gce/gcediscovery"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup/gce/tpm/gcetpmsigner"
|
||||
"k8s.io/kops/upup/pkg/fi/cloudup/hetzner"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
|
||||
"k8s.io/kops/upup/pkg/fi/secrets"
|
||||
|
@ -378,9 +377,6 @@ func (c *NodeUpCommand) Run(out io.Writer) error {
|
|||
case "dryrun":
|
||||
assetBuilder := assets.NewAssetBuilder(c.cluster, false)
|
||||
target = fi.NewNodeupDryRunTarget(assetBuilder, out)
|
||||
case "cloudinit":
|
||||
checkExisting = false
|
||||
target = cloudinit.NewCloudInitTarget(out)
|
||||
default:
|
||||
return fmt.Errorf("unsupported target type %q", c.Target)
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
"k8s.io/kops/util/pkg/hashing"
|
||||
)
|
||||
|
@ -211,21 +210,3 @@ func (_ *Archive) RenderLocal(t *local.LocalTarget, a, e, changes *Archive) erro
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RenderCloudInit implements fi.Task::Render functionality for a CloudInit target
|
||||
func (_ *Archive) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *Archive) error {
|
||||
archiveName := e.Name
|
||||
|
||||
localFile := path.Join(localArchiveDir, archiveName)
|
||||
t.AddMkdirpCommand(localArchiveDir, 0o755)
|
||||
|
||||
targetDir := e.TargetDir
|
||||
t.AddMkdirpCommand(targetDir, 0o755)
|
||||
|
||||
url := e.Source
|
||||
t.AddDownloadCommand(cloudinit.Always, url, localFile)
|
||||
|
||||
t.AddCommand(cloudinit.Always, "tar", "xf", localFile, "-C", targetDir)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ import (
|
|||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
)
|
||||
|
||||
|
@ -249,7 +248,3 @@ func (e *BindMount) execute(t Executor) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *BindMount) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *BindMount) error {
|
||||
return fmt.Errorf("BindMount::RenderCloudInit not implemented")
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
)
|
||||
|
||||
|
@ -80,7 +79,3 @@ func (e *Chattr) execute(t Executor) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *Chattr) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *Chattr) error {
|
||||
return fmt.Errorf("Chattr::RenderCloudInit not implemented")
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/install"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
)
|
||||
|
@ -313,37 +312,3 @@ func (_ *File) RenderLocal(_ *local.LocalTarget, a, e, changes *File) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *File) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *File) error {
|
||||
dirMode := os.FileMode(0o755)
|
||||
fileMode, err := fi.ParseFileMode(fi.ValueOf(e.Mode), 0o644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid file mode for %s: %q", e.Path, *e.Mode)
|
||||
}
|
||||
|
||||
if e.Type == FileType_Symlink {
|
||||
t.AddCommand(cloudinit.Always, "ln", "-s", fi.ValueOf(e.Symlink), e.Path)
|
||||
} else if e.Type == FileType_Directory {
|
||||
parent := filepath.Dir(strings.TrimSuffix(e.Path, "/"))
|
||||
t.AddCommand(cloudinit.Once, "mkdir", "-p", "-m", fi.FileModeToString(dirMode), parent)
|
||||
t.AddCommand(cloudinit.Once, "mkdir", "-m", fi.FileModeToString(dirMode), e.Path)
|
||||
} else if e.Type == FileType_File {
|
||||
err = t.WriteFile(e.Path, e.Contents, fileMode, dirMode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
return fmt.Errorf("File type=%q not valid/supported", e.Type)
|
||||
}
|
||||
|
||||
if e.Owner != nil || e.Group != nil {
|
||||
t.Chown(e.Path, fi.ValueOf(e.Owner), fi.ValueOf(e.Group))
|
||||
}
|
||||
|
||||
if e.OnChangeExecute != nil {
|
||||
return fmt.Errorf("OnChangeExecute not supported with CloudInit")
|
||||
// t.AddCommand(cloudinit.Always, e.OnChangeExecute...)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
)
|
||||
|
||||
|
@ -119,13 +118,3 @@ func (_ *GroupTask) RenderLocal(t *local.LocalTarget, a, e, changes *GroupTask)
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *GroupTask) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *GroupTask) error {
|
||||
args := buildGroupaddArgs(e)
|
||||
cmd := []string{"groupadd"}
|
||||
cmd = append(cmd, args...)
|
||||
klog.Infof("Creating group %q", e.Name)
|
||||
t.AddCommand(cloudinit.Once, cmd...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@ import (
|
|||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/pkg/backoff"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
"k8s.io/kops/upup/pkg/fi/utils"
|
||||
"k8s.io/kops/util/pkg/hashing"
|
||||
|
@ -168,7 +167,3 @@ func (_ *LoadImageTask) RenderLocal(t *local.LocalTarget, a, e, changes *LoadIma
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *LoadImageTask) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *LoadImageTask) error {
|
||||
return fmt.Errorf("LoadImageTask::RenderCloudInit not implemented")
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@ import (
|
|||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/pkg/apis/kops"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
"k8s.io/kops/util/pkg/distributions"
|
||||
"k8s.io/kops/util/pkg/hashing"
|
||||
|
@ -377,24 +376,3 @@ func (_ *Package) RenderLocal(t *local.LocalTarget, a, e, changes *Package) erro
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *Package) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *Package) error {
|
||||
packageName := e.Name
|
||||
if e.Source != nil {
|
||||
localFile := path.Join(localPackageDir, packageName)
|
||||
t.AddMkdirpCommand(localPackageDir, 0o755)
|
||||
|
||||
url := *e.Source
|
||||
t.AddDownloadCommand(cloudinit.Always, url, localFile)
|
||||
|
||||
t.AddCommand(cloudinit.Always, "dpkg", "-i", localFile)
|
||||
} else {
|
||||
packageSpec := packageName
|
||||
if e.Version != nil {
|
||||
packageSpec += " " + *e.Version
|
||||
}
|
||||
t.Config.Packages = append(t.Config.Packages, packageSpec)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/install"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
"k8s.io/kops/util/pkg/distributions"
|
||||
|
@ -421,28 +420,6 @@ func (s *Service) RenderLocal(_ *local.LocalTarget, a, e, changes *Service) erro
|
|||
return nil
|
||||
}
|
||||
|
||||
func (_ *Service) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *Service) error {
|
||||
systemdSystemPath, err := e.systemdSystemPath()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
serviceName := e.Name
|
||||
|
||||
servicePath := path.Join(systemdSystemPath, serviceName)
|
||||
err = t.WriteFile(servicePath, fi.NewStringResource(*e.Definition), 0o644, 0o755)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if fi.ValueOf(e.ManageState) {
|
||||
t.AddCommand(cloudinit.Once, "systemctl", "daemon-reload")
|
||||
t.AddCommand(cloudinit.Once, "systemctl", "start", "--no-block", serviceName)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Service) GetName() *string {
|
||||
return &s.Name
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/protokube/pkg/gossip/dns/hosts"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
)
|
||||
|
||||
|
@ -94,7 +93,3 @@ func (_ *UpdateEtcHostsTask) RenderLocal(t *local.LocalTarget, a, e, changes *Up
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *UpdateEtcHostsTask) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *UpdateEtcHostsTask) error {
|
||||
return fmt.Errorf("UpdateEtcHostsTask::RenderCloudInit not supported")
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
"k8s.io/kops/util/pkg/distributions"
|
||||
)
|
||||
|
@ -94,8 +93,3 @@ func (_ *UpdatePackages) RenderLocal(t *local.LocalTarget, a, e, changes *Update
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *UpdatePackages) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *UpdatePackages) error {
|
||||
t.Config.PackageUpdate = true
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ import (
|
|||
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
||||
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
||||
)
|
||||
|
||||
|
@ -128,13 +127,3 @@ func (_ *UserTask) RenderLocal(t *local.LocalTarget, a, e, changes *UserTask) er
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (_ *UserTask) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *UserTask) error {
|
||||
args := buildUseraddArgs(e)
|
||||
cmd := []string{"useradd"}
|
||||
cmd = append(cmd, args...)
|
||||
klog.Infof("Creating user %q", e.Name)
|
||||
t.AddCommand(cloudinit.Once, cmd...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue