github.com/jlmeeker/kismatic@v1.10.1-0.20180612190640-57f9005a1f1a/integration-tests/validate.go (about)

     1  package integration_tests
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"html/template"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  	"time"
    12  
    13  	homedir "github.com/mitchellh/go-homedir"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  func validateMiniPkgInstallationDisabled(provisioner infrastructureProvisioner, distro linuxDistro) {
    19  	WithMiniInfrastructure(distro, provisioner, func(node NodeDeets, sshKey string) {
    20  		sshUser := node.SSHUser
    21  		if err := ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    22  			Fail("Missing dependencies, but still passed")
    23  		}
    24  
    25  		By("Adding docker repository")
    26  		prep := getPrepForDistro(distro)
    27  		theNode := []NodeDeets{node}
    28  		err := runViaSSH(prep.CommandsToPrepDockerRepo, theNode, sshKey, 5*time.Minute)
    29  		FailIfError(err, "failed to add docker repository")
    30  
    31  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    32  			Fail("Missing dependencies, but still passed")
    33  		}
    34  
    35  		By("Installing Docker")
    36  		err = runViaSSH(prep.CommandsToInstallDocker, theNode, sshKey, 5*time.Minute)
    37  		FailIfError(err, "failed to install docker")
    38  
    39  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    40  			Fail("Missing dependencies, but still passed")
    41  		}
    42  
    43  		By("Adding kubernetes repository")
    44  		err = runViaSSH(prep.CommandsToPrepKubernetesRepo, theNode, sshKey, 5*time.Minute)
    45  		FailIfError(err, "failed to add kubernetes repository")
    46  
    47  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    48  			Fail("Missing dependencies, but still passed")
    49  		}
    50  
    51  		By("Installing Kubelet")
    52  		err = runViaSSH(prep.CommandsToInstallKubelet, theNode, sshKey, 5*time.Minute)
    53  		FailIfError(err, "failed to install the kubelet package")
    54  
    55  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    56  			Fail("Missing dependencies, but still passed")
    57  		}
    58  
    59  		By("Installing Kubectl")
    60  		err = runViaSSH(prep.CommandsToInstallKubectl, theNode, sshKey, 5*time.Minute)
    61  		FailIfError(err, "failed to install the kubectl package")
    62  
    63  		if err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey); err == nil {
    64  			Fail("Missing dependencies, but still passed")
    65  		}
    66  
    67  		By("Installing Glusterfs Server")
    68  		err = runViaSSH(prep.CommandsToInstallGlusterfs, theNode, sshKey, 5*time.Minute)
    69  		FailIfError(err, "failed to install the glusterfs package")
    70  
    71  		err = ValidateKismaticMiniDenyPkgInstallation(node, sshUser, sshKey)
    72  		Expect(err).To(BeNil())
    73  	})
    74  }
    75  
    76  // ValidateKismaticMini runs validation against a mini Kubernetes cluster
    77  func ValidateKismaticMini(node NodeDeets, user, sshKey string) PlanAWS {
    78  	By("Building a template")
    79  	template, err := template.New("planAWSOverlay").Parse(planAWSOverlay)
    80  	FailIfError(err, "Couldn't parse template")
    81  
    82  	log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP)
    83  	By("Building a plan to set up an overlay network cluster on this hardware")
    84  	plan := PlanAWS{
    85  		Etcd:                []NodeDeets{node},
    86  		Master:              []NodeDeets{node},
    87  		Worker:              []NodeDeets{node},
    88  		MasterNodeFQDN:      node.Hostname,
    89  		MasterNodeShortName: node.Hostname,
    90  		SSHUser:             user,
    91  		SSHKeyFile:          sshKey,
    92  	}
    93  
    94  	// Create template file
    95  	f, fileErr := os.Create("kismatic-testing.yaml")
    96  	FailIfError(fileErr, "Error waiting for nodes")
    97  	defer f.Close()
    98  	w := bufio.NewWriter(f)
    99  	execErr := template.Execute(w, &plan)
   100  	FailIfError(execErr, "Error filling in plan template")
   101  	w.Flush()
   102  
   103  	// Run validation
   104  	By("Validate our plan")
   105  	err = runValidate(f.Name())
   106  	FailIfError(err, "Error validating plan")
   107  	return plan
   108  }
   109  
   110  func ValidateKismaticMiniDenyPkgInstallation(node NodeDeets, sshUser, sshKey string) error {
   111  	By("Building a template")
   112  	template, err := template.New("planAWSOverlay").Parse(planAWSOverlay)
   113  	FailIfError(err, "Couldn't parse template")
   114  
   115  	log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP)
   116  	By("Building a plan to set up an overlay network cluster on this hardware")
   117  	plan := PlanAWS{
   118  		DisablePackageInstallation: true,
   119  		Etcd:                []NodeDeets{node},
   120  		Master:              []NodeDeets{node},
   121  		Worker:              []NodeDeets{node},
   122  		Ingress:             []NodeDeets{node},
   123  		Storage:             []NodeDeets{node},
   124  		MasterNodeFQDN:      node.Hostname,
   125  		MasterNodeShortName: node.Hostname,
   126  		SSHUser:             sshUser,
   127  		SSHKeyFile:          sshKey,
   128  	}
   129  
   130  	// Create template file
   131  	f, fileErr := os.Create("kismatic-testing.yaml")
   132  	FailIfError(fileErr, "Error waiting for nodes")
   133  	defer f.Close()
   134  	w := bufio.NewWriter(f)
   135  	execErr := template.Execute(w, &plan)
   136  	FailIfError(execErr, "Error filling in plan template")
   137  	w.Flush()
   138  
   139  	// Run validation
   140  	By("Validate our plan")
   141  	return runValidate(f.Name())
   142  }
   143  
   144  func ValidateKismaticMiniWithBadSSH(node NodeDeets, user, sshKey string) PlanAWS {
   145  	By("Building a template")
   146  	template, err := template.New("planAWSOverlay").Parse(planAWSOverlay)
   147  	FailIfError(err, "Couldn't parse template")
   148  
   149  	log.Printf("Created single node for Kismatic Mini: %s (%s)", node.id, node.PublicIP)
   150  	By("Building a plan to set up an overlay network cluster on this hardware")
   151  	plan := PlanAWS{
   152  		Etcd:                []NodeDeets{node},
   153  		Master:              []NodeDeets{node},
   154  		Worker:              []NodeDeets{node},
   155  		MasterNodeFQDN:      node.Hostname,
   156  		MasterNodeShortName: node.Hostname,
   157  		SSHUser:             user,
   158  		SSHKeyFile:          sshKey,
   159  	}
   160  
   161  	// Create template file
   162  	f, fileErr := os.Create("kismatic-testing.yaml")
   163  	FailIfError(fileErr, "Error waiting for nodes")
   164  	defer f.Close()
   165  	w := bufio.NewWriter(f)
   166  	execErr := template.Execute(w, &plan)
   167  	FailIfError(execErr, "Error filling in plan template")
   168  	w.Flush()
   169  
   170  	// Run validation
   171  	By("Validate our plan")
   172  	err = runValidate(f.Name())
   173  	FailIfSuccess(err)
   174  	return plan
   175  }
   176  
   177  func getBadSSHKeyFile() (string, error) {
   178  	dir, err := homedir.Dir()
   179  	if err != nil {
   180  		return "", err
   181  	}
   182  	// create empty file
   183  	_, err = os.Create(filepath.Join(dir, ".ssh", "bad.pem"))
   184  	if err != nil {
   185  		return "", fmt.Errorf("Unable to create tag file!")
   186  	}
   187  
   188  	return filepath.Join(dir, ".ssh", "bad.pem"), nil
   189  }
   190  
   191  func runValidate(planFile string) error {
   192  	cmd := exec.Command("./kismatic", "install", "validate", "-f", planFile)
   193  	cmd.Stdout = os.Stdout
   194  	cmd.Stderr = os.Stderr
   195  	return cmd.Run()
   196  }