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  }