github.com/coreos/mantle@v0.13.0/kola/tests/coretest/cloudinit.go (about) 1 package coretest 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "os/exec" 9 "path" 10 "strings" 11 "syscall" 12 ) 13 14 const cloudinitBinPath = "/usr/bin/coreos-cloudinit" 15 16 func read(filename string) (string, error) { 17 bytes, err := ioutil.ReadFile(filename) 18 return string(bytes), err 19 } 20 21 func rmdir(path string) error { 22 cmd := exec.Command("sudo", "rm", "-rf", path) 23 return cmd.Run() 24 } 25 26 func TestCloudinitCloudConfig() error { 27 workspace, err := ioutil.TempDir("", "coretest-cloudinit-") 28 if err != nil { 29 return fmt.Errorf("Failed creating workspace: %v", err) 30 } 31 defer rmdir(workspace) 32 33 keyOne := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5LaGMGRqZEEvOhHlIEiQgdMJIQ9Qe8L/XSz06GqzcESbEnYLIXar2nou4eW4AGMVC1V0BrcWWnSTxM1/dWeCLOUt5NulKAjtdBUZGhCT83nbimSzbmx3/q2y5bCiS4Zr8ZjYFbi1eLvye2jKPE4xo7cvIfDKc0ztQ9kU7JknUdKNZo3RKXr5EPhJ5UZ8Ff15CI9+hDSvdPwer+HNnEt/psRVC+s29EwNGwUXD4IYqrk3X4ew0YAl/oULHM4cctoBW9GM+kAl40rOuIARlKfe4UdCgDMHYA/whi7Us+cPNgPit9IVJVBU4eo/cF5molD2l+PMSntypuv79obu8sA1H cloudinit-test-key-one" 34 keyTwo := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCZw5Ljtt9wlEfyDvmUwu/BeMcIhVarbcM4ajZolxRy9G8vvCa7ODcSjzSyhfG1mLSBB2KfaFFI6zGHBjFX0Gzy9i8m3u7PnZBPX30bb1n0hJCrUhpqUGQUe8OFdoBstf1HIwJU/KoTBL0Ap1WEn0quRT4kNgBLbPrMjYCPbS1q4wJKdIE5rRm/EfTUrmIb0i91gujEGw5oUHDXf0X+/cxwwIVZh1z16YhOgvJBzXhsJ9a0w7kcy/6wPRv03yyMg/r2Ada6ci68LulKz5GLn+xInT0bvIcra/PZ7WE+jyZhZKly239VZyT/1dHkBbTw+kgnGobLMbjOOg5bKaT8NZJ3 cloudinit-test-key-two" 35 36 configTmpl := `#cloud-config 37 coreos: 38 etcd: 39 discovery: https://discovery.etcd.io/827c73219eeb2fa5530027c37bf18877 40 ssh_authorized_keys: 41 - %s 42 - %s 43 ` 44 configData := fmt.Sprintf(configTmpl, keyOne, keyTwo) 45 configFile, err := ioutil.TempFile(os.TempDir(), "coretest-") 46 if err != nil { 47 return fmt.Errorf("Failed creating tempfile: %v", err) 48 } 49 defer syscall.Unlink(configFile.Name()) 50 51 if _, err := io.WriteString(configFile, configData); err != nil { 52 return fmt.Errorf("Failed writing %s: %v", configFile.Name(), err) 53 } 54 55 if stdout, stderr, err := Run("sudo", cloudinitBinPath, "--workspace", workspace, "--from-file", configFile.Name(), "--ssh-key-name", "coretest"); err != nil { 56 return fmt.Errorf("coreos-cloudinit failed with error: %v\nstdout: %s\nstderr: %s", err, stdout, stderr) 57 } 58 59 contents, err := read("/run/systemd/system/etcd.service.d/20-cloudinit.conf") 60 if err != nil { 61 return fmt.Errorf("Unable to read etcd bootstrap file: %v", err) 62 } else if !strings.Contains(contents, "Environment=\"ETCD_DISCOVERY=https://discovery.etcd.io/827c73219eeb2fa5530027c37bf18877\"") { 63 return fmt.Errorf("Incorrect data written to etcd.service.d/20-cloudinit.conf: %s", contents) 64 } 65 66 // Attempt to clean up after ourselves 67 defer Run("update-ssh-keys", "-d", "coretest") 68 69 authorized_keys, err := read("/home/core/.ssh/authorized_keys") 70 if err != nil { 71 return fmt.Errorf("Unable to read authorized_keys file: %v", err) 72 } 73 74 if !strings.Contains(authorized_keys, keyOne) { 75 return fmt.Errorf("Could not find first key in authorized_keys") 76 } 77 78 if !strings.Contains(authorized_keys, keyTwo) { 79 return fmt.Errorf("Could not find second key in authorized_keys") 80 } 81 82 return nil 83 } 84 85 func TestCloudinitScript() error { 86 workspace, err := ioutil.TempDir("", "coretest-cloudinit-") 87 if err != nil { 88 return fmt.Errorf("Failed creating workspace: %v", err) 89 } 90 defer rmdir(workspace) 91 92 configData := `#!/bin/bash 93 /bin/sleep 10 94 ` 95 configFile, err := ioutil.TempFile(os.TempDir(), "coretest-") 96 if err != nil { 97 return fmt.Errorf("Failed creating tempfile: %v", err) 98 } 99 defer syscall.Unlink(configFile.Name()) 100 101 if _, err := io.WriteString(configFile, configData); err != nil { 102 return fmt.Errorf("Failed writing %s: %v", configFile.Name(), err) 103 } 104 105 if stdout, stderr, err := Run("sudo", cloudinitBinPath, "--workspace", workspace, "--from-file", configFile.Name()); err != nil { 106 return fmt.Errorf("coreos-cloudinit failed with error: %v\nstdout: %s\nstderr: %s", err, stdout, stderr) 107 } 108 109 unitName, err := read(path.Join(workspace, "scripts", "unit-name")) 110 if err != nil { 111 return fmt.Errorf("Unable to read unit name from cloudinit workspace: %v", err) 112 } 113 defer Run("systemctl", "stop", unitName) 114 115 stdout, stderr, err := Run("systemctl", "status", unitName) 116 if err != nil { 117 return fmt.Errorf("Unable to determine if user-data was executed: %v\nstdout: %s\nstderr: %s", err, stdout, stderr) 118 } 119 120 if !strings.Contains(stdout, "Active: active") { 121 return fmt.Errorf("User-data unit is not active") 122 } 123 124 return nil 125 }